ActiveRecord, has_many: through и Полиморфные ассоциации

Folks,

Хотите, чтобы я правильно понял это. И, пожалуйста, обратите внимание на случай для наследования здесь (SentientBeing), пытаясь вместо этого сосредоточиться на полиморфных моделях в has_many: через отношения. Тем не менее, рассмотрим следующее …

class Widget  :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  grouper has_many :widgets, :through => :widget_groupings end class Alien  grouper has_many :widgets, :through => :widget_groupings end class WidgetGrouping  true end 

В идеальном мире, я бы хотел, с учетом Виджета и Лица, сделать что-то вроде:

 widget.people << my_person 

Однако, когда я это делаю, я заметил, что тип «grouper» всегда имеет значение null в widget_groupings. Однако, если я что-то вроде следующего:

 widget.widget_groupings < self, :person => my_person}) 

Тогда все работает так, как я обычно ожидал. Я не думаю, что когда-либо видел, что это происходит с не полиморфными ассоциациями, и просто хотел знать, было ли это что-то конкретное для этого варианта использования или я потенциально смотрю на ошибку.

Спасибо за любую помощь!

Известна проблема с Rails 3.1.1, которая нарушает эту функциональность. Если у вас возникла эта проблема, попробуйте сначала обновить ее, она исправлена ​​в 3.1.2

Ты так близко. Проблема в том, что вы неправильно используете параметр: source. : источник должен указывать на связь с полиморфными отношениями. Затем все, что вам нужно сделать, это указать: source_type для отношения, которое вы пытаетесь определить.

Это исправление модели Widget должно позволить вам делать именно то, что вы ищете.

 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 

Как упоминалось выше, это не работает с рельсами 3.1.1 из-за ошибки на: source, но исправлено в Rails 3.1.2

имеет много: сквозных и полиморфных, не работают вместе. Если вы попытаетесь получить к ним доступ напрямую, это должно вызвать ошибку. Если я не ошибаюсь, вам нужно написать writeget.people и процедуру push.

Я не думаю, что это ошибка, это просто то, что еще не реализовано. Я бы предположил, что мы видим это в этой функции, потому что у каждого есть случай, когда они могут его использовать.

Давайте будем гением компьютера.