親のbefore_saveコールバックで子レコードを変更する際に苦労しています。before_saveコールバックの子レコードを変更する
子レコードは、main
というブール値の属性を持つPhoto
です。
親レコードはhas_many :photos
レコードを変更するためのフォームがdeal
に変更を加えるためにネストされていると、ユーザーはまた、photo
の属性を変更したり、追加したり、photos
を削除することができDeal
です。
ここには擦れがあります。私はいつもmain
の写真を持っている必要があります。私は写真をチェックするbefore_saveコールバックでこれを行う予定です。リストには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
最初の例は、取引が既に永続化されている場合にのみ機能します。代わりに 'assign_attribute'を使用することで救済することができます。しかし、後の例は最初の方が良いアイデアです。 – max