Ruby on rails Rails:我应该使用观察器还是回调(使字段保持最新)?

Ruby on rails Rails:我应该使用观察器还是回调(使字段保持最新)?,ruby-on-rails,activerecord,callback,models,observer-pattern,Ruby On Rails,Activerecord,Callback,Models,Observer Pattern,我正在开发一个系统,ActiveRecord实体和字段需要始终保持一致。通常,某些字段是从其他字段派生的,需要始终保持最新。有时,这甚至可能发生在实体之间 例如: class User < ActiveRecord::Base attr_accessible :first_name, :last_name attr_protected :name # I need to keep 'name' up to date at all times after_update d

我正在开发一个系统,ActiveRecord实体和字段需要始终保持一致。通常,某些字段是从其他字段派生的,需要始终保持最新。有时,这甚至可能发生在实体之间

例如:

class User < ActiveRecord::Base
  attr_accessible :first_name, :last_name
  attr_protected  :name

  # I need to keep 'name' up to date at all times
  after_update do
    name = self.first_name + ' ' + self.last_name
    true
  end
end
class用户
这里的哲学问题是,我是否应该在回调中或在观察者中实现这种类型的行为(以及数百种类似的行为)。我可以想出以下两个理由:

回调
  • 行为定义更容易访问(只需查看模型定义,您就知道在哪里可以查看)
  • 保持字段/实体之间的一致性不是一个辅助问题,而是实体行为的一个复杂部分。事实上,保持数据一致性(隐含地)是任何实体的首要要求
观察员
  • 随着系统行为最终变得更加复杂,模型往往更加轻量级(而不是使用数百种回调方法)
  • 保持字段/实体之间的一致性是一个辅助问题,与模型的主要职责无关;因此,应将其分解为外部观察者
有经验的人能给我一些启发吗?
  • 有什么我没有考虑的具体问题吗
  • 在决定哪些内容属于回调还是观察员方面,您的指导方针是什么

根据设计模式手册,这最适合观察者模式。使用和观察者,后更新/保存逻辑与模型解耦。很难从您的示例中分辨出来,但是如果您正在通过回调更新其他模型,那么您正在用其他模型的知识污染您的用户模型。因此,观察者应该介入来处理这个问题


此外,您还可以禁用Rails中的观察者,从而使单元测试更快,而不必担心触发“回调”。

observators=>与对象无关的事件及其自身相关问题: