Как отложить создание ассоциации до создания подкласса в активной записи? - PullRequest
0 голосов
/ 09 августа 2009

У меня есть четыре таблицы: jp_properties, cn_properties, jp_dictionaries и cn_dictioanries.

И каждый jp_property принадлежит jp_dictionary с внешним ключом «dictionary_id» в таблице.

Точно так же каждый cn_property принадлежит cn_dictionary с внешним ключом "dictionary_id" в таблице тоже.

Поскольку в модели свойств и в модели словаря много одинаковых функций, я хотел бы сгруппировать все эти функции в abstract_class.

Модели такие:

class Property < AR::Base
  self.abstract_class = true
  belongs_to :dictionry,
             :foreign_key=>'dictionary_id',
             :class=> ---ModelDomainName--- + "Dictionary"

  ### functions shared by JpProperty and CnProperty
end

class Dictionary < AR::Base
  self.abstract_class = true
  has_many :properties,
           :foreign_key=>'dictionary_id',
           :class=> ---ModelDomainName--- + "Dictionary"

  ### functions shared by JpDictionary and CnDictionary
end

class JpProperty < Property
  :set_table_name :jp_properties
end

class CnProperty < Property
  :set_table_name :cn_properties
end

class JpDictionary < Dictionary
  :set_table_name :jp_dictionaries
end

class CnDictionary < Dictionary
  :set_table_name :cn_dictionaries
end

Как видно из вышеприведенного кода, часть --- ModelDomainName --- имеет значение «Jp» или «Cn». И я хочу получить эти строки динамически из экземпляров JpProperty, JpDictionary, CnProperty или CnDictionary.

Например:

tempJpProperty = JpProperty.first
tempJpProperty.dictionary #=> will get 'Jp' from tempJpProperty's class name and then apply it to the "belongs_to" declaration.

Итак, проблема в том, что я не знаю, как указать часть --- ModelDomainName ---.

В частности, я понятия не имею, как получить имя класса экземпляра объекта подкласса в теле родительского класса.

Не могли бы вы помочь мне с этой проблемой?

Edit:

У кого-нибудь есть идеи?

По сути, я хочу спросить, как ' отложить создание ассоциации до подкласс создан . '?

1 Ответ

0 голосов
/ 09 августа 2009

Вы должны быть в состоянии сделать что-то вроде этого:

class Property < AR::Base
  self.abstract_class = true
  belongs_to :dictionry,
             :foreign_key=>'dictionary_id',
             :class=> #{singlenton_class} + "Dictionary" 

  def singlenton_class
     class << self; self; end 
  end  
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...