1

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

假设我有 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] ,但它说不能在多态关联中使用包含。

我怎样才能急切加载或优化这个问题以避免这种严重的退化?

任何帮助将不胜感激 !!

4

1 回答 1

0

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

例如,给定您的模型,您应该能够执行以下操作来获取过去 90 天内创建的电影:

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

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

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

PS。一个非常有用的技巧是在编写搜索时打开 Rails 控制台中的日志记录。这使您可以直接在控制台中查看生成的 SQL,而无需挖掘日志。

于 2010-07-15T00:11:04.620 回答