2013-04-22 111 views
3

使用Rails 3.2。我的模型嵌套在这样一种方式:急切加载不同嵌套多态

  • 回顾=>应审查(国家或店铺)
  • 国家=> CountryDay =>商店=>照片
  • 店=>照片

我有以下几点:

@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()-表达式来获得您需要的结果。