在其父级的before-save回调中修改子记录时遇到困难。
子记录是Photo
,它有一个名为main
的属性,该属性是布尔值。
父记录是Deal
的has_many :photos
修改记录的表单被嵌套以对adeal
进行更改,用户还可以更改aphoto
的属性或添加或删除photos
。
这就是问题所在。我需要始终有一张main
照片,我计划在保存前回调中执行此操作,在这里我检查照片,如果列表中没有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
完成此操作后,您现在以一种尴尬的方式耦合了
Deal
和Photos
,该方式在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/