-1

我着手解决我们遇到的问题,在某些情况下;我们可能需要使属性或关系不可变,即一旦属性被写入,它就永远被写入。attr_readonly不合适,因为这对关系不起作用,所以我试图在这里证明这个概念:

http://pastie.org/562329

这显示了我的测试,一个示例实现(理想情况下我会移动到一个模块)——我不确定这是否是一种可以接受的重载关系设置器的方法,我已经将测试扩展为现在阅读http://pastie .org/562417这可能有点矫枉过正,但帮助我了解 customer_id 与客户作为属性而不是关系的关系,但我很乐意得到纠正!

4

2 回答 2

4

我还没有尝试过,但我认为update_attribute(:customer_id => 1)在某些情况下会中断。另外,我真的不喜欢覆盖属性设置器的想法。

更好的(恕我直言)方法是覆盖'before_update',如果有任何更改,则不接受它。你可以使用Dirty模块来做到这一点。看看这个:

我还没有测试过这个,但它会是这样的:

class Order < ActiveRecord::Base
  IMMUTABLE = %w{customer_id notes}

  before_save do |record|
    return false if IMMUTABLE.any? { |attr| record.changed.has_key?(attr) }
  end
end

当然,您将对如何处理 IMMUTABLE 有一个更好的想法。如果你把它放在一个模块中, before_save 必须在Module#included钩子中

于 2009-07-29T06:08:56.317 回答
-2

您可以这样定义 setter 方法,即在第一次写入后,该方法将自身重新定义为无操作。

class Order < ActiveRecord::Base
  def customer= c
    if c
      super
      class << self
        def customer= c
        end
      end
    end
  end
end
于 2009-07-29T03:53:40.147 回答