5

これは私の質問へのフォローアップです: ActiveModel での子の関連付けの更新

親に関連付けられた多数の子レコードを更新する標準/正しい方法を探しています。

親がいるとしましょう(has_manyで子テーブルに接続され、:autosave => true)。

obj = Parent.first

今、私はその子を繰り返し処理し、それらを更新します。

obj.each.do |child|
    child.remark = "something"
end

obj.save を呼び出すときに、子を親と一緒に保存したいのですが、前の質問で説明したように、それを行う唯一の方法は、次のように直接更新することです。

obj.children.first.remark = "something"

(または各子を保存しますが、これには明示的なトランザクションが必要であり、ここでは使用しないでください)。

これを実装する正しい方法は何ですか?

ありがとう!

*編集:ここで与えられたアドバイスに従って、これをモデルに追加しました:

class Parent < ActiveRecord::Base

     has_many :children, :inverse_of => :parent,:autosave=>true

     accepts_nested_attributes_for :children

それでも、

x = Parent.first
c = x.children.first
c.remark = "something"
x.save    # => doesn't update c
4

2 に答える 2

1

save メソッドを上書きすることもできますが、私はそうしません。なぜこのようなことをしないのですか?

def save_with_children
  Child.transaction do
    children.each do |child|
      if child.changed?
        child.save
      end
    end
  end
  save
end

これにより、1 つのクエリが実行されます。10,000,000 件のレコードがある場合、おそらく機能しないでしょうが、それについて言及していませんでした。

于 2013-08-07T21:13:34.217 に答える