0

我有一个belongs_to与另一个模型有关系的 Rails 模型。

class Foo < ActiveRecord::Base
  belongs_to :bar
end

每次在 abar上设置/更新时,foo我都想“拦截”对该更改的修改并在foo.

我的猜测是我可以覆盖 setterbar并做我想做的事。但是,由于我对 Ruby/Rails 比较陌生,我担心的是有一些“神奇”的方式bar可以设置在foo不通过我的设置器的情况下(可能是批量分配、更新/更新所有调用, ETC)。

什么是最安全的方法来确保任何更改bar运行一个响应该更改的代码块?

4

2 回答 2

2

根据您的需要,您可以在 bar 上使用回调来在 foo.xml 上执行特定代码。

您需要的所有文档都在这里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

覆盖 setterbar不是一个好主意。

一个例子:

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, ... >

尽管barsetter 已被覆盖,因此它什么也不做,但您可以很容易地绕过它。对于您实现的任何自定义更新也是如此Foo:在这种情况下,更新关联时不会调用它。

改用回调。

于 2013-01-29T14:32:15.503 回答