在其父级的before-save回调中修改子记录时遇到困难。
子记录是Photo,它有一个名为main的属性,该属性是布尔值。
父记录是Dealhas_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

完成此操作后,您现在以一种尴尬的方式耦合了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/

10-12 13:08