ActiveRecord, имеет много: сквозные и полиморфные Ассоциации
люди,
хотите убедиться, что я понимаю это правильно. И, пожалуйста, не обращайте внимания на случай наследования здесь (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})
тогда все работает, как я обычно ожидал. Я не думаю, что когда-либо видел, как это происходит с неполиморфными ассоциациями, и просто хотел знать, было ли это что-то конкретное для этого случая использования или если я потенциально смотрю на ошибку.
Спасибо за любую помощь!
3 ответа:
есть известная проблема с рельсов 3.1.1, что нарушает эту функцию. Если у вас возникла эта проблема сначала попробуйте обновить, это было исправлено в 3.1.2
ты так близко. Проблема в том, что вы неправильно используете параметр :source. : источник должен указывать на полиморфное отношение belongs_to. Тогда все что вам нужно сделать, это указать :source_type для отношений вы пытаетесь определить.
это исправление для модели виджета должно позволить вам делать именно то, что вы ищете.
class Widget < ActiveRecord::Base has_many :widget_groupings has_many :people, :through => :widget_groupings, :source => :grouper, :source_type => 'Person' has_many :aliens, :through => :widget_groupings, :source => :grouper, :source_type => 'Alien' end
Как упоминалось выше, это не работает с rails 3.1.1 из-за ошибки on :source, но она исправлена в Rails 3.1.2
много :и полиморфных не работают вместе. Если вы попытаетесь получить к ним прямой доступ, он должен выдать ошибку. Если я не ошибаюсь, вы должны вручную написать виджет.людей и рутины.
Я не думаю, что это ошибка, это просто то, что еще не реализовано. Я бы предположил, что мы видим это в функции, потому что у каждого есть случай, в котором они могли бы его использовать.