1

这就是我的想法:

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
4

1 回答 1

1

您的要求与您发布的示例不匹配是否有原因?

class Widget < ActiveRecord::Base
  belongs_to :layout, :polymorphic => true
end

class InformationalLayout < DefaultLayout
  has_many :widgets, :as => :layout
end

class OneWayCommunicationLayout < DefaultLayout
  has_many :widgets, :as => :layout
end

def DefaultLayout < ActiveRecord::Base
 #no relationship here, only class inheritance 

  def get_sorted_data
    return 'example data'
  end
end

# eg
widget.find(1).layout.class => InformationalLayout
widget.find(2).layout.class => OneWayCommunicationLayout

widget.find(1).layout.get_sorted_data => 'example data'
widget.find(2).layout.get_sorted_data => 'example data'
于 2010-09-08T13:00:25.207 回答