Hatena::ブログ(Diary)

Oh! My! Enter! 〜バッチを起動しようと勢いよくキーを叩いたら、それはシフトキーだった〜 このページをアンテナに追加 RSSフィード

2012-04-22

has_many側の不要なやつはdeleteして更新したい

has_manyで複数の子供を持っている親モデルが有るとします。その複数の子供たちもまとめて更新したいときにはaccepts_nested_attributes_forが便利です。

models/parent.rb ---親モデル

has_many :children
accepts_nested_attributes_for :children

これで親モデルをsaveするときに、同時に子モデルであるchildren側も自動で更新してくれます。しかし、新規(create)の場合は問題ないのですが、更新(update)する時に不要な子は削除したいという場合、これだけでは不十分です。
accepts_nested_attributes_for のオプションの:allow_destroyを使用するという手もあるのですが、View側に_destroy属性を用意できない場合などは不便です。

そこでもっと手軽に削除出来る方法を見つけました。mark_for_destructionというメソッドを使用します。これは「このオブジェクトはもう要らないから、後でdeleteしてね」的な目印を付けるメソッドです。

先程の例で、childrenの属性nameがblankの場合は削除してしまいたいとしましょう。parent.rbの任意の場所(before_updateのコールバックメソッド等)に以下のコードを記述します。

models/parent.rb --- 親モデル

children.each{ |child| child.mark_for_destruction if child.name.blank? }

これで、親モデルをsaveしたときに、nameがブランクの子供はdeleteされます。

結構マイナーなメソッドみたいなので紹介してみました。もっと良い方法を知ってる方はご教授ください!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/itmammoth/20120422/1335087511
リンク元
Connection: close