Рельсы касается вопросов

Я начинаю использовать шаблон проблем в проекте, и, поскольку он используется впервые, возникли некоторые вопросы. Прежде всего, позвольте мне поделиться фрагментом кода, над которым я работаю, для пояснения.

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 состояния: одобрено, ожидает рассмотрения и не одобрено. Вот некоторые из моих сомнений по поводу кода, который я написал.

Для того, чтобы эта проблема работала, модель должна иметь атрибут opy_status, который необходимо как-то сохранить. Это неправильно? Должны ли проблемы определять поведение только как интерфейсы? Если нет, как я могу обеспечить существование этого атрибута в Rails? Есть ли способ сказать генератору модели рельсов всегда включать этот атрибут в утвержденные модели без наследования?

Мне также нужно реализовать метод Approve(), но у каждого утверждаемого класса есть собственный процесс утверждения. Единственное, что общего в том, что, если все пойдет хорошо, одобрено?() Должно возвращать true потом. Есть ли способ обеспечить существование метода Approve(), если класс включает в себя утверждение Approvable?

Это хороший случай, чтобы использовать проблемы?

Надеюсь, я ясно дал понять.

Заранее спасибо,

1 ответ

Решение

@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 - это тот, который должен обрабатывать бизнес-логику утверждения на основе своего права вызывающего абонента?

Другие вопросы по тегам