2

我正在开发一个系统,其中 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

这里的哲学问题是我是否应该在回调或观察者内部实现这种类型的行为(以及数百个类似的行为)。我可以想到以下两个原因:

回调

  • 行为定义更容易访问(您只需查看模型定义就知道在哪里查看)
  • 保持字段/实体之间的一致性不是辅助问题,而是实体行为的复杂部分。事实上,保持数据的一致性(隐含地)是任何实体的首要要求。

观察员

  • 随着系统行为最终变得更加复杂,模型往往更轻量级(不会因数百个回调方法而臃肿)
  • 保持字段/实体之间的一致性是一个辅助问题,与模型的主要职责无关;因此,应该将其分解为外部观察者

有经验的大侠可以赐教一下吗?

  • 有没有我没有考虑过的具体考虑因素?
  • 在决定什么属于回调和观察者方面,您的指导方针是什么?
4

1 回答 1

1

根据设计模式一书,这最适合观察者模式。使用 and Observer,您的 after_update/save 逻辑与您的模型分离。从您的示例中很难看出,但是如果您从回调中更新其他模型,那么您正在使用其他模型的知识污染您的用户模型。因此,Observer 应该介入处理。

此外,您可以在 Rails 中禁用观察者,从而在您不关心触发“回调”的情况下更快地进行单元测试。

于 2012-09-27T18:15:49.053 回答