2012-04-30 3 views
0

У меня есть продавцы, которые продают различные виды продуктов (Живопись, Песня, Книга и т. Д.).присоединяется к полиморфному столу

У меня есть таблица покупок, имеет полиморфные ассоциации продукта с использованием product_id и product_type, где product_type бы живописи, песни, книги и т.д.

Я хочу сделать запрос продавцу, чтобы получить список всех своих продуктов, которые были приобретены, но я получаю это:

Purchase.joins (: продукт) .limit (10) .offset (9000)

Hirb Error: Can not eagerly load the polymorphic association :product 

ответ

0

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

class Purchase 
    belongs_to :product, :polymorphic => true 
end 
class Painting 
    has_many :purchases, :as => :product 
end 
class Song 
    has_many :purchases, :as => :product 
end 
class Book 
    has_many :purchases, :as => :product 
end 

Поскольку ассоциация продуктов в классе Purchase является полиморфной, она не имеет представления о том, что все таблицы должны быть объединены в поиске. Как бы ActiveRecord знал, чтобы присоединиться к картинам, песням и книгам, но нет других таблиц? Он не знает, поэтому он не может присоединиться.

+0

Он может искать различные значения в product_type и выводить требуемые таблицы. Но это, вероятно, все равно не сработает. Как тогда я получу список покупок для продавца, если продавец не находится в таблице покупок, и я не могу присоединиться к нему? В настоящее время я делаю это для каждого типа продукта, а затем комбинируя/сортируя через ruby. Не впечатляет. – pixelearth

+0

ОК, он мог бы знать, но не будет делать соединение на разных таблицах. –

+0

Этот ответ заключался в том, что активная запись не сделает этого. Вы были в тупике, и я подумал, что вам просто нужно знать, как это работает. Получение результатов - это еще один ответ. –

1

Это, как я делаю это сейчас:

class Seller < User 
    def sales 
    Purchase.where("(product_id in (?) AND product_type = 'Book') OR (product_id IN (?) AND product_type = 'Song')", books.collect(&:id), songs.collect(&:id)) 
    end 
end 
+1

Пожалуйста, переместите этот «ответ» в свой вопрос, а затем удалите это. Это путь stackoverflow. – SingleShot

0

Поскольку у вас действительно есть множественное наследование таблицы, вы могли бы иметь таблицу продуктов с полиморфным внешним ключом каждой запись продукта в любой таблице. Взаимоотношения между продуктами, продавцами и покупками с использованием таблицы продуктов. Если вам нужны детали конкретного проекта, например название книги, разыщите внешний ключ в продуктах и ​​получите запись книг.

Смежные вопросы