Как мне абстрагировать аналогичные проверки / отношения с родительским классом в Ruby / Rails? - PullRequest
0 голосов
/ 01 июня 2011

У меня есть ОЧЕНЬ похожие классы:

class DeliveryDocument < CommercialDocument
  # Relations
  belongs_to :biller, :class_name => 'Company'
  belongs_to :customer, :class_name => 'Company'
  belongs_to :customer_center, :class_name => 'Center'
  has_many :delivery_document_lines, :dependent => :destroy
  alias_attribute :lines, :delivery_document_lines
  # Some configuration
  accepts_nested_attributes_for :delivery_document_lines
  acts_as_freezable :only_dependencies => true,
    :has_many => [:delivery_document_lines],
    :belongs_to => [:biller, :customer, :customer_center]
  acts_as_clonable :has_many => [:delivery_document_lines]
  validates_each :lines do |record, attr, value|
    # ...
  end
end

И

class InvoiceDocument < CommercialDocument
  self.
  # Relations
  belongs_to :biller, :class_name => 'Company'
  belongs_to :customer, :class_name => 'Company'
  belongs_to :customer_center, :class_name => 'Center'
  has_many :invoice_document_lines, :dependent => :destroy
  alias_attribute :lines, :invoice_document_lines
  # Some configuration
  accepts_nested_attributes_for :invoice_document_lines
  acts_as_freezable :only_dependencies => true,
    :has_many => [:invoice_document_lines],
    :belongs_to => [:biller, :customer, :customer_center]
  acts_as_clonable :has_many => [:invoice_document_lines]
  # Validations
  validates_each :lines do |record, attr, value|
    # ...
  end
end

У меня также есть несколько методов, которые я не вставлял, которые можно было извлечь в родительский. Мне нужно знать только имя класса в родительском. Когда я делаю это:

class CommercialDocument < Document  # document inherits from AR::Base
  # ...
  has_many :"#{self.to_s.underscore}_lines", :dependent => :destroy
  # ...
  accepts_nested_attributes_for :"#{self.to_s.underscore}_lines"
  # ...
end

это не работает, потому что self.to_s - это CommercialDocument.

Как бы вы изменили это поведение в родительском классе? Я мог бы поместить вещи в модуль и импортировать его, но тогда вся иерархия документов становится почти бесполезной. У меня уже есть иерархия документов, поэтому, если я могу, я хочу использовать ее, если есть способ.

1 Ответ

0 голосов
/ 01 июня 2011

Вы можете попробовать использовать Class.inherited

...