ActiveRecord модель наследования и полиморфизма - PullRequest
1 голос
/ 18 июня 2011

У меня есть классовая иерархия, но не наследование одной таблицы.

ThrowAway < ActiveRecord::Base

и

Junk < ThrowAway

проблема в том, чтовсе ThrowAway объекты имеют ссылки на Location.A Location

belongs_to :throw_away, :polymprohic => true

Проблема заключается в том, что если я определю

ThrowAway < ActiveRecord::Base
  has_many :locations, :as => :throw_away
end

, то даже если Junk наследует от него и определяет другое имя таблицы,Столбец throw_away_type всегда будет установлен на ThrowAway, где я на самом деле хочу, чтобы он был установлен на Junk.

Теперь будет много таких подклассов, поэтому будет Stuff < ThrowAway Rags < ThrowAway и т. Д. Яхотите, чтобы все они имели Location без определения отношения местоположения в каждом отдельном классе.

Возможно ли это с рельсами?Проблема в том, что здесь есть не только местоположение, но и другие подобные отношения, и я бы предпочел придерживаться СУХОГО здесь.Я предполагаю, что мне нужно создать метод генератора, который будет выполняться на текущем объекте и генерировать эти генераторы отношений во время выполнения.

Спасибо.

1 Ответ

1 голос
/ 18 июня 2011

ActiveRecord, похоже, не способен взаимодействовать с наследованием модели, которое не является STI.К счастью, это, вероятно, не то, что вы действительно хотите в любом случае.Вы, вероятно, вместо этого хотите использовать миксины.

Создайте модуль, который содержит все функции, которые вы хотите, чтобы ваши модели совместно использовали, и включите этот модуль во все ваши модели.Я бы, вероятно, поместил модуль в каталог ваших моделей, но дал бы ему прилагательное в качестве имени.Некоторые люди могут поместить модуль в каталог lib или создать для него каталог lib в каталоге моделей.

В вашем случае вы захотите, чтобы ассоциация была определена во время смешивания модуля,так что вам нужно будет использовать обратный вызов.Нечто подобное ..

module Trashable
  def self.included(base)
    base.send :has_many, :locations, :as => :throw_away
  end
end
...