这就是我的想法:
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 指南:
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
这里“拥有”模型(产品或员工)可以是许多类之一。我想让“拥有”模型成为许多类之一,所有这些类都从另一个类继承基本行为。此外,所有这些子类的行为都大相径庭,以至于 STI 效率极低。我在这里很迷茫......我很感激你能提供的任何帮助!
编辑:只是为了澄清我想要做什么......我有一个名为 Widget 的“拥有”类。小部件代表类似于非常简单的网络应用程序的东西。每个小部件都可以通过几种不同布局中的一种来表示。因此,我定义了这些不同的布局类。布局在外观和行为上可能有很大差异,但它们确实具有一些共同的功能。因此,我想将这种常见行为提取到它们可以继承的 WidgetLayout 类中。最后,任何 Widget 都可以与一个“特定”布局相关联(无论是 Informational、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