Rails关注问题

时间:2014-11-24 00:51:34

标签: ruby-on-rails design-patterns separation-of-concerns

我开始在项目中使用关注模式,因为这是第一次使用它,一些问题浮现在脑海中。首先,让我分享我正在努力澄清的代码snipet。

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()方法?

这是一个使用问题的好例子吗?

希望我能说清楚。

提前致谢,

1 个答案:

答案 0 :(得分:0)

@Surya,

感谢您的想法。只是为了看看我是否正确,你建议我应该有一个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应该根据其调用者权限来处理批准业务逻辑吗?