2012-06-03 43 views
0

有没有办法覆盖所有可写的ActiveRecord关联方法的行为?例如,我有一个名为“请求”这样的模式:如何防止添加/删除记录到基于另一个字段的活动记录关联?

class Request < ActiveRecord::Base 
    has_many :line_items 
end 

的请求模型有一个名为“状态”栏。如果状态不是“DRAFT”,我希望line_items关系的所有可写入ActiveRecord关联方法都会引发异常。我知道我可以indivdually覆盖它们,就像这样:

class Request < ActiveRecord::Base 
    has_many :line_items 

    def line_items=(args) 
     if status != 'DRAFT' 
     raise Exception.new "cannot edit a non-draft request" 
     else 
     write_attribute :line_items, args 
     end 
    end 
end 

然而,也有很多方法,这些方法的ActiveRecord创建这些协会(见http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html“自动生成的方法”)。

感谢您的任何帮助。

回答

1

如果某些对象没有被您的rails代码接受,那么首先您应该查看该对象类本身,而不是其他任何关联的类,除非您确实跟踪了这一点,否则这些line_items的规则实际上是在请求模型中编码的。它更好的LineItem知道为什么它的对象被拒绝,而不是请求知道它。

然后,你们很多人不希望所有的请求关联都遵循相同的规则。

所以,我提出这一点,

class LineItem < ActiveRecord::Base 
    belongs_to :request 
    before_save :raise_if_draft_request 
    def raise_if_draft_request 
    raise Exception.new "cannot edit a non-draft request" if self.request.status=='DRAFT' 
    end 
end