Folks,
Хочу убедиться, что я правильно это понимаю. И, пожалуйста, не обращайте внимания на наследование здесь (SentientBeing), пытаясь вместо этого сосредоточиться на полиморфных моделях в has_many: через отношения. Тем не менее, рассмотрите следующее ...
class Widget < ActiveRecord::Base
has_many :widget_groupings
has_many :people, :through => :widget_groupings, :source => :person, :conditions => "widget_groupings.grouper_type = 'Person'"
has_many :aliens, :through => :widget_groupings, :source => :alien, :conditions => "video_groupings.grouper_type = 'Alien'"
end
class Person < ActiveRecord::Base
has_many :widget_groupings, :as => grouper
has_many :widgets, :through => :widget_groupings
end
class Alien < ActiveRecord::Base
has_many :widget_groupings, :as => grouper
has_many :widgets, :through => :widget_groupings
end
class WidgetGrouping < ActiveRecord::Base
belongs_to :widget
belongs_to :grouper, :polymorphic => true
end
В идеальном мире я бы хотел сделать что-то вроде виджета и человека:
widget.people << my_person
Однако, когда я это делаю, я заметил, что «тип» группировщика всегда равен нулю в widget_groupings. Однако, если мне нужно что-то вроде следующего:
widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person})
Тогда все работает так, как я обычно ожидал. Я не думаю, что когда-либо видел, как это происходит с неполиморфными ассоциациями, и просто хотел знать, было ли это чем-то особенным для этого варианта использования или я потенциально смотрю на ошибку.
Спасибо за любую помощь!
Как упоминалось выше, это не работает с rails 3.1.1 из-за ошибки: source, но это исправлено в Rails 3.1.2.
источник
имеет много: сквозной и полиморфный не работают вместе. Если вы попытаетесь получить к ним доступ напрямую, это должно вызвать ошибку. Если я не ошибаюсь, вам нужно вручную написать widget.people и процедуру push.
Я не думаю, что это ошибка, это просто то, что еще не реализовано. Я могу представить, что мы видим это в этой функции, потому что у каждого есть кейс, в котором они могут ее использовать.
источник