Уместна ли здесь полиморфная ассоциация? - PullRequest
1 голос
/ 08 сентября 2010

Вот что я думаю:

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

1 Ответ

1 голос
/ 08 сентября 2010

Есть ли причина, по которой ваши требования не соответствуют опубликованному вами примеру?

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'
...