attr_accessors只是属性改变了触发器回调?

时间:2014-05-07 14:59:51

标签: ruby-on-rails

(我正在运行的rails的特定版本是2.3.8,但不管ruby / rails版本如何,都会感谢你的答案)

有一次,我在我的一个模型中使用了attr_accessor来控制状态 该模型还具有status属性和由before_update回调触发的函数。

它看起来像这样

class Foo < ActiveRecord::Base
  attr_accessor :bar
  before_update :revise_status


  def revise_status
    if status == "start_state"
      if bar
        self.status = "end_state"
      end
    elsif status == "end_state"
      #this was the end_state and was not supposed to be left
    end
  end

end

正如您所看到的,我使用attr_accessor作为一个信号,表明应该从一个状态转换到另一个状态。通过这种方式,我有效地制作了一个简单的状态机。 我看到没有理由保存转换,因此attr_accessor。

这种方法效果相当不错,除了没有更改属性时,除了attr_accessor之外,我的函数没有被调用。

有没有办法让attr_accessor表现得好像是脏的,而不是nil?

1 个答案:

答案 0 :(得分:1)

rails dirty机制允许你告诉它会发生什么变化,例如你可以改变条形码作者

def bar= value
  status_will_change!
  @value = value
end

告诉我们需要保存状态列(状态列是否实际已经改变(或者确实会改变)并不重要。它只是确保rails认为有必要保存它记录栏。