0

是否有覆盖所有可写 ActiveRecord 关联方法的行为?例如,我有一个名为“Request”的模型,如下所示:

class Request < ActiveRecord::Base
   has_many :line_items
end

Request 模型有一个名为“status”的字段。如果状态不是“草稿”,我希望 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上的“自动生成的方法” )。

谢谢你的帮助。

4

1 回答 1

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
于 2012-06-03T05:39:45.463 回答