has_many: через вторичный полиморфизм - PullRequest
0 голосов
/ 27 мая 2009

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

Вероятно, легче понять, просто увидев код:

class CategorySection < ActiveRecord::Base
  has_many :categories
  has_many :categorizations, :through => :categories
  has_many :classifieds, :through => :categories
end

class Category < ActiveRecord::Base
  belongs_to :section, :class_name => 'CategorySection', 
                       :foreign_key => 'category_section_id', 
                       :counter_cache => true
  has_many :categorizations
  has_many :classifieds, :through => :categorizations, 
                         :source => :categorizable, 
                         :source_type => 'Classified'
end

class Categorization < ActiveRecord::Base
  belongs_to :category, :counter_cache => true
  belongs_to :categorizable, :polymorphic => true
end

class Classified < ActiveRecord::Base
  has_one :categorization, :as => :categorizable, :dependent => :destroy
  has_one :category, :through => :categorization
end

По большей части все это работает правильно, за исключением одной ассоциации, которую я не могу понять. Учитывая раздел «Категория», как я могу быстро найти все принадлежащие ему объявления?

Например:

Учитывая категорию, я могу получить все ее категории:

>> @category.categorizations
>> [<Categorization...>,<Categorization...>]

Учитывая категорию, я могу получить все объявления в ней:

>> @category.classifieds
>> [<Classified...>,<Classified...>]

Учитывая раздел, я могу получить все его категории:

>> @section.categories
>> [<Category...>,<Category...>]

Учитывая раздел, я могу пройти через все его классификации: категории

>> @section.categorizations
>> [<Categorization...>,<Categorization...>]

Но, учитывая Раздел, я не могу пройти через все его объявления: категории

>> @section.classifieds
ActiveRecord::HasManyThroughSourceAssociationMacroError: 
Invalid source reflection macro :has_many :through for 
has_many :classifieds, :through => :categories. Use :source 
to specify the source reflection.

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

Любые советы или предложения будут наиболее ценными. Заранее спасибо.

С уважением, Kenny

Ответы [ 2 ]

0 голосов
/ 29 мая 2009

Насколько я помню, Rails не позволяют использовать: через несколько раз в ассоциациях. Конечно, вы не можете сделать что-то вроде этого:

has_many :books
has_many :authors, :through => :books
has_many :phones, :through => :authors

но я не уверен, что это позволяет делать двойной: через в отдельных моделях (как у вас). Во-первых, вы можете попытаться сделать это без полиморфизма - если это работает, то мое предложение неверно.

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

Конечно, вы можете написать свой собственный: finder_sql для этой ассоциации.

0 голосов
/ 28 мая 2009

Вы пытались определить has_many без ":through"?

class CategorySection < ActiveRecord::Base
  has_many :categories
  has_many :categorizations, :through => :categories
  has_many :classifieds
end

Возможно, стоит взглянуть на этот railscast .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...