0

belongs_to別のモデルと関係のある Rails モデルがあります。

class Foo < ActiveRecord::Base
  belongs_to :bar
end

barでが設定/更新されるたびfooに、その変更の変更を「インターセプト」し、 で何かを更新しfooます。

私の推測では、セッターをオーバーライドして、barやりたいことができると思います。しかし、私はRuby / Railsに比較的慣れていないので、セッターを介さずにbar設定できる「魔法の」方法があることを懸念しています(おそらく、一括代入、​​update / update_all呼び出し、foo等)。

barへの変更が、その変更に反応するコードのブロックを実行することを保証する最も安全な方法は何ですか?

4

2 に答える 2

2

必要に応じて、バーでコールバックを使用して、foo で特定のコードを実行できます。

必要なドキュメントはすべてここにありますhttp://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

例えば ​​:

class Bar < ActiverRecord::Base
    has_many :foos
    before_save :do_something

    private
        def do_something
            self.foos.each {|f| f.update_attribute('bar_has_changed', true) }
        end
end
于 2013-01-29T14:24:27.400 に答える
1

セッターをオーバーライドすることbarはお勧めできません。

適例:

class Foo < ActiveRecord::Base
  belongs_to :bar

  def bar=(value)
    # do nothing
  end
end

f = Foo.create
b = Bar.create
f.update_attributes(bar_id: b.id)
f.bar
# => #<Bar id: 1, ... >

barセッターは何もしないようにオーバーライドされていますが、これは非常に簡単に回避できます。同じことが、実装するカスタム更新にも当てはまりますFoo。このような場合、関連付けが更新されたときに呼び出されません。

代わりにコールバックを使用してください。

于 2013-01-29T14:32:15.503 に答える