无论如何都要覆盖所有可写ActiveRecord关联方法的行为?例如,我有一个名为“Request”的模型,如下所示:
class Request < ActiveRecord::Base
has_many :line_items
end
Request模型有一个名为“status”的字段。如果status不是“DRAFT”,我希望line_items关系的所有可写ActiveRecord关联方法都抛出异常。我知道我可以单独覆盖它们,就像这样:
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上的“自动生成的方法”)。
感谢您的帮助。
答案 0 :(得分: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