Вопрос

Люди,

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

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

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

widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person}) 

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

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

Это было полезно?

Решение

Существует известная проблема с Rails 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 из-за ошибки в :source, но это исправлено в Rails 3.1.2

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top