Рельсы касается вопросов
Я начинаю использовать шаблон проблем в проекте, и, поскольку он используется впервые, возникли некоторые вопросы. Прежде всего, позвольте мне поделиться фрагментом кода, над которым я работаю, для пояснения.
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 - это тот, который должен обрабатывать бизнес-логику утверждения на основе своего права вызывающего абонента?