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

Folks,

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

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

Ответы на вопрос(3)

это нене работает с rails 3.1.1 из-за ошибки на: source, но это 'исправлено в Rails 3.1.2

 EmFi05 дек. 2011 г., 10:11
Решение Вопроса

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

Вы'так близко. Проблема в тебеповторное использование опции: source. : источник должен указывать на полиморфное отношение принадлежащие к. Тогда все, что вам нужно сделать, это указать: 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
 EmFi06 нояб. 2009 г., 18:28
Нет проблем, я думаю, я мучился в течение дня от того, как сделать это в первый раз, когда я столкнулся с этим. Didn»не поможет, что это было одно из первых, что я пытался сделать в Rails,Это подразумевает следование учебнику / книге.
 Damon Aw22 окт. 2012 г., 12:57
То же самое, что упоминал @Shtirlic. Есть ли способ не указывать source_type, поэтому у вас есть смешанный набор результатов? Если бы кто-нибудь решил это, хотелось бы узнать как.
 Matthias21 авг. 2014 г., 12:33
это все еще работает в рельсах 4.1.5? Я неЯ так не думаю ..
 Emeka27 февр. 2016 г., 16:27
По-прежнему работает с Rails 4.2.0. Тем не менее, есть ли способ сделать это в наши дни без source_type и двух отдельных ассоциаций?
 Cory06 нояб. 2009 г., 16:58
Боже мой, это так больно очевидно, что я не могу поверить, что застеклен прямо над ним. Спасибо EmFi!
 EmFi05 дек. 2011 г., 10:11
Как указывает scotkf, в ActiveRecord 3.1.1 существует регрессия, которая блокирует это поведение. Обновление до 3.1.2 позволит этому решению работать.
 Donato Azevedo27 февр. 2014 г., 02:51
Я продолжаю получатьНеизвестный первичный ключ для таблицы 'jointable» в моделиJointable»... тот же код, что и выше.
 Aymeric24 окт. 2011 г., 18:30
Безразлично»Кажется, больше не работает с ActiveRecord 3.1.1.
 jeffdill205 янв. 2016 г., 02:13
Спасибо вам большое за это!
 EmFi27 февр. 2014 г., 21:56
@DonatoAzevedo: ваша миграция определяет первичный ключ для этой таблицы соединений?
 Shtirlic20 янв. 2012 г., 18:08
правда ли, что я могу изменить исходные поля просто: as => : морской окунь

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

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

 ScottJ06 нояб. 2009 г., 21:46
Они работают вместе. Например: has_many: подписки,: as => : subsableable has_many: подписчики,: through => : подписки,: источник => : пользователь
 cgr07 нояб. 2009 г., 02:35
Я приведу пример моего ошибочного кода в виде отдельного поста в ближайшем будущем :) Это избавит меня от головной боли, чтобы выяснить, как обойти эту ошибку.

Ваш ответ на вопрос