簡體   English   中英

在 before_save 回調中修改子記錄

[英]Modify a child record in before_save callback

努力在其父級的 before_save 回調中修改子記錄。

子記錄是Photo ,它有一個名為main的屬性,它是一個布爾值。

父記錄是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管理該屬性。 更好的方法是創建一個新的關系來對此進行建模,將屬性的責任完全保留在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM