2014-11-24 55 views
0

我開始在項目中使用關注模式,因爲這是第一次使用它,所以出現了一些問題。首先,讓我分享我正在努力澄清的代碼snipet。Rails關注問題

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

這是一個很好的情況下使用的擔憂?

希望我說清楚了。

由於提前,

+0

爲什麼不創建多態模型類來處理所有可批准的模型,而不是在每個模型的表上添加'approvalStatus'列? – Surya 2014-11-24 12:21:44

回答

0

@Surya,

感謝您的想法。爲了看看我是否得到了正確的結果,您建議我應該有一個ApprovalStatus類,它具有以下形式的多態關係:可批准的。

喜歡的東西:

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 

在這種情況下,審批狀態是應該處理基於其主叫權approvement業務邏輯的人嗎?

+0

看起來很對我。您是否嘗試保存任何記錄以查看它是否按照您期望的方式工作? – Surya 2014-11-25 06:53:01