如何根据其他字段阻止向Active Record关联添加/删除记录?

时间:2012-06-03 00:50:15

标签: ruby-on-rails ruby activerecord

无论如何都要覆盖所有可写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上的“自动生成的方法”)。

感谢您的帮助。

1 个答案:

答案 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