【发布时间】:2012-09-19 11:06:56
【问题描述】:
我正在开发一个系统,其中 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
这里的哲学问题是我是否应该在回调或观察者内部实现这种类型的行为(以及数百个类似的行为)。我可以想到以下两个原因:
回调
- 行为定义更易于访问(您只需查看模型定义就知道在哪里查看)
- 保持字段/实体之间的一致性不是辅助问题,而是实体行为的复杂部分。事实上,保持数据的一致性(隐含地)是任何实体的首要要求。
观察者
- 随着系统行为最终变得更加复杂,模型趋向于更轻量级(不会因数百个回调方法而臃肿)
- 保持字段/实体之间的一致性是一个辅助问题,与模型的主要职责无关;因此,应该将其分解为外部观察者
能否请有经验的大侠赐教?
- 是否有任何我没有考虑过的具体注意事项?
- 在决定什么属于回调和观察者方面,您的指导方针是什么?
【问题讨论】:
-
观察者 => 与对象本身无关的事件
标签: ruby-on-rails activerecord callback models observer-pattern