Вот что я думаю:
class Widget < ActiveRecord::Base
has_one :widget_layout
end
class WidgetLayout < ActiveRecord::Base
belongs_to :widget
belongs_to :layoutable, :polymorphic => true
end
class InformationalLayout < WidgetLayout
has_one :widget_layout, :as => :layoutable
end
class OneWayCommunicationLayout < WidgetLayout
has_one :widget_layout, :as => :layoutable
end
Я совершенно уверен, что это совершенно неправильно. То, что я пытаюсь сделать, похоже, прямо противоположно тому, как я видел полиморфные ассоциации. Например, из Rails Guides:
class Picture < ActiveRecord::Base
belongs_to :imageable, :polymorphic => true
end
class Employee < ActiveRecord::Base
has_many :pictures, :as => :imageable
end
class Product < ActiveRecord::Base
has_many :pictures, :as => :imageable
end
Здесь модель "владения" (Продукт или Сотрудник) может быть одним из многих классов. Я хотел бы, чтобы «принадлежащая» модель была одним из многих классов, каждый из которых наследовал базовое поведение другого класса. Кроме того, поведение всех этих подклассов достаточно отличается, так что ИППП будет чрезвычайно неэффективным. Я совершенно заблудился здесь ... Я ценю любую помощь, которую вы можете оказать!
РЕДАКТИРОВАТЬ: Просто чтобы уточнить, что я хочу сделать ... У меня есть «владеющий» класс под названием Widget. Виджет представляет собой нечто похожее на очень простое веб-приложение. Каждый виджет может быть представлен одним из нескольких различных макетов. Следовательно, я определяю эти разные классы макетов. Макеты могут сильно различаться как по внешнему виду, так и по поведению, но они имеют некоторые общие функции. Из-за этого я хотел бы извлечь это общее поведение в класс WidgetLayout, от которого они могут наследовать. В конце концов, любой виджет может быть связан с одним «конкретным» макетом (будь то информационный, OneWayCommunication и т. Д.). Я просто не уверен, как должна быть структурирована эта настройка.
РЕДАКТИРОВАТЬ (Последний, я надеюсь!): Ааа, снова глядя на ваш пример, я вижу его. Единственное, чего мне не хватает, так это того, что макеты наследуют обычное поведение. Итак, будет ли что-то вроде этой работы?:
class Widget < ActiveRecord::Base
belongs_to :layout, :polymorphic => true
end
class InformationalLayout < WidgetLayout
has_many :widgets, :as => :layout
end
class OneWayCommunicationLayout < WidgetLayout
has_many :widgets, :as => :layout
end
class WidgetLayout < ActiveRecord::Base
# Define common behaviour here
end