[英]Modify a child record in before_save callback
努力在其父級的 before_save 回調中修改子記錄。
子記錄是Photo
,它有一個名為main
的屬性,它是一個布爾值。
父記錄是Deal
, has_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
完成此操作后,您現在以一種笨拙的方式將Deal
和Photos
結合在一起,在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.