gpt4 book ai didi

ruby-on-rails - 在 before_save 回调中修改子记录

转载 作者:数据小太阳 更新时间:2023-10-29 08:58:47 28 4
gpt4 key购买 nike

努力在父记录的 before_save 回调中修改子记录。

子记录是Photo有一个名为 main 的属性这是一个 bool 值。

父记录是Dealhas_many :photos

修改记录的表单是嵌套修改一个deal用户还可以更改 photo 的属性或添加或删除 photos .

问题就在这里。我需要总是有一个 main照片,我计划在 before_save 回调中执行此操作,我会在其中检查照片,如果 main 的列表中没有照片我在列表中的第一张照片上将 main 设置为 true。

它不会保存子记录,我希望它会。我已经添加了调试语句,所以我可以证明正在调用该方法,我还可以声明 main 的值被标记为 true ...它只是没有被保存。我误解了这个回调吗?灯棚会很棒。谢谢大家!

class Deal < ActiveRecord::Base

has_many :photos, dependent: :destroy
accepts_nested_attributes_for :photos, allow_destroy: :true

before_save :set_main_photo


### bunch of other unrelated stuff

private
def set_main_photo
if self.photos
if self.photos.main.nil?
self.photos.first.main = true
end
end
end
end

最佳答案

这里发生了几件事,但您的主要问题是以这种方式修改子项不会自动保存记录。您需要更新您的 set_main_photo 以在子记录上调用 .save。当您这样做时,其他一些更改是谨慎的:

def set_main_photo
if photos.any?
unless photos.main.present?
photos.first.update_attribute :main, true
end
end
end

完成此操作后,您现在以一种笨拙的方式将 DealPhotos 耦合在一起,该方式在 Photo 上有一个属性表示条件它与 Deal 的关系,以及管理该属性的 Deal。更好的方法是创建一个新的关系来对此进行建模,将对属性的责任完全放在 Deal 中:

class Deal
has_many :photos
belongs_to :main_photo, class_name: 'Photo'
end

class Photo
belongs_to :deal
end

这样您就可以简单地设置 deal.main_photo = deal.photos.first,然后设置 deal.save

关于ruby-on-rails - 在 before_save 回调中修改子记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41969518/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com