【问题标题】:Rails Concerns questionsRails 关注问题
【发布时间】: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


【解决方案1】:

@苏利亚,

感谢您的想法。只是为了看看我是否正确,您建议我应该有一个 ApprovalStatus 类,它与 :approvable 具有多态关系。

类似:

class ApprovalStatus < ActiveRecord::Base
    belongs_to :approvable, polymorphic: true
end

class JoinRequest < ActiveRecord::Base
    has_one :approval_status, as: :approvable
end

class PatchInstallation < ActiveRecord::Base
    has_one :approval_status, as: :approvable
end

在这种情况下,ApprovalStatus 应该根据其调用者来处理批准业务逻辑吗?

【讨论】:

  • 对我来说很合适。您是否尝试保存任何记录以查看它是否按您预期的方式工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多