【问题标题】:Eager loading for polymorphic associations多态关联的急切加载
【发布时间】:2011-03-16 02:37:55
【问题描述】:

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

假设我有 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
}

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

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

我怎样才能预先加载或优化这个问题以避免这种严重的降级??

任何帮助将不胜感激!

【问题讨论】:

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


【解决方案1】:

如果您使用的是searchlogic,则有一种特殊的语法可以帮助处理多态关系。您可以通过指定以type 为后缀的相关类的名称,在关系的has 一侧进行搜索。

例如鉴于您的模型,您应该能够执行以下操作来获取过去 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,而无需挖掘日志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-26
    • 2017-08-28
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    相关资源
    最近更新 更多