【发布时间】:2014-11-24 00:51:33
【问题描述】:
我开始在项目中使用关注模式,因为这是第一次使用它,所以我想到了一些问题。首先,让我分享一下我正在编写的代码片段以进行澄清。
module Approvable
extend ActiveSupport::Concern
included do
#validations
validates :approval_status,
presence: true,
inclusion: { :in => NixusValidation::ValidApprovalStatuses, :message => :inclusion, unless: 'approval_status.blank?' }
#scopes:
scope :approved, -> { where(approvalStatus: NixusValidation::ApprovalStatuses::APPROVED) }
scope :pending, -> { where(approvalStatus: NixusValidation::ApprovalStatuses::PENDING) }
scope :unapproved, -> { where(approvalStatus: NixusValidation::ApprovalStatuses::UNAPPROVED) }
end
#INSTANCE METHODS
#methods:
def approved?()
self.approval_status == NixusValidation::ApprovalStatuses::APPROVED
end
end
这个问题定义了“可批准”模型的共同特征,例如加入请求等需要批准的东西。我项目中每个可批准的模型都有 3 个状态,已批准、待定和未批准。以下是我对自己写的代码的一些疑惑。
为了使这个问题起作用,模型需要有一个 approval_status 属性,该属性需要以某种方式持久化。这是错的吗?关注点应该只定义接口之类的行为吗?如果不是,我怎样才能在 Rails 中强制这个属性的存在?有没有办法告诉 Rails 模型生成器始终将此属性包含在可批准的模型中而无需继承?
我还需要实现一个approve() 方法,但是每个可批准的类都有自己的批准过程。唯一的共同点是,如果一切顺利,批准?() 之后应该返回 true。如果一个类包含 Approvable 关注点,有没有办法强制存在approve() 方法?
这是使用关注点的好案例吗?
希望我说清楚了。
提前致谢,
【问题讨论】:
-
为什么不创建一个多态模型类来处理所有可批准的模型,而不是在每个模型的表上添加
approvalStatus列?
标签: ruby-on-rails design-patterns separation-of-concerns