2013-04-22 4 views
3

Использование Rails 3.2. Мои модели вложены таким образом:Яркая нагрузка по-разному вложенная полиморфная

  • Обзор => Reviewable (Страна или магазин)
  • Страна => CountryDay => Магазин => Фотографии
  • Shop => Фото

у меня есть следующий:

@reviews = @user.reviews.includes(:user, :reviewable) 

Обычно мы можем включать вложенный полиморфные таким образом:

# this will return errors because :shop is not found in the model Shop (:reviewable is actually :shop) 
@reviews = @user.reviews.includes(:user, :reviewable => [:shop]) 

# this will return errors because :photos is not directly associated to Country 
@reviews = @user.reviews.includes(:user, :reviewable => :photos) 

Существует много других вариантов. Как я могу обойти это, чтобы ActiveRecord включал правильную модель, основанную на ее ассоциации?

ответ

1

Я думаю, что у меня была такая же проблема только сейчас. При попытке загрузить ассоциации я получил ActiveRecord::EagerLoadPolymorphicError. Мое решение состояло в том, чтобы собрать пользовательскую команду объединения, которую я ввел в область для более удобного использования.

непроверенная, но это может заставить вас идти:

class Review < ActiveRecord::Base 
    scope :eagerly_loaded, -> { 
    joins(' 
     INNER JOIN shops 
     ON (reviews.reviewable_type = "Shop" AND reviews.reviewable_id = shops.id) 
     INNER JOIN countries 
     ON (reviews.reviewable_type = "Country" reviews.reviewable_id = countries.id) 
    ') 
    } 
end 

Вы затем использовать @user.reviews.eagerly_loaded. Обязательно используйте подходящее объявление .group(), чтобы получить только те, которые вам нужны.

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