渴望加载多态关联

时间:2010-07-14 21:33:04

标签: ruby-on-rails activerecord eager-loading

不确定这可能属于性能部分以及模型/数据库部分,所以这里...... [/ p>

假设我有3个型号:

Movie {
has_one :interest, :as => :resource
}
Song {
has_one :interest, :as => :resource
}
Story {
has_one :interest, :as => :resource
}

和......

Interest {
belongs_to :resource, :polymorphic => true
}

现在,如果我需要所有电影的所有兴趣列表,并且我还要显示这些电影对象的创建日期(说明它们的年龄),那么我使用resource_type属性上的查找然后@ some_interest.resource.created_at。

问题是如果我有100个电影兴趣,那么我会得到101个查询吗?所以线性退化。我尝试过使用:include => [:resource]在我的查询调用中,但它表示不能在多态关联中使用include。

如何急切加载或优化此问题以避免严重降级?

非常感谢任何帮助!!

1 个答案:

答案 0 :(得分:0)

如果您使用searchlogic,则可以使用特殊语法来处理可能有用的多态关系。您可以通过指定以has为后缀的相关类的名称来搜索关系的type侧。

E.g。鉴于你的模特,你应该能够做这样的事情来获得过去90天创作的电影:

Interest.resource_movie_type_created_at_gt(Time.now-90.days)

Searchlogic为您设置相关模型的联接,这应该可以缓解性能问题。

当然,您始终可以使用find_by_sql方法编写自己的SQL。

PS。在编写搜索时,一个非常有用的技巧是turn on logging in the Rails console。这使您可以在控制台中查看生成的SQL,而无需深入了解日志。