如何以高效的方式检索“关联”记录和“关联通过”记录?

时间:2012-03-04 15:40:14

标签: sql ruby-on-rails ruby ruby-on-rails-3 performance

我正在使用Ruby on Rails 3.1,我正在尝试改进SQL查询,以便以高效的方式检索“关联”记录和“关联通过”记录(ActiveRecord::Associations),以避免“ N + 1查询问题“。也就是说,我有:

class Article < ActiveRecord::Base
  has_many :category_relationships

  has_many :categories,
    :through => :category_relationships
end

class Category < ActiveRecord::Base
  has_many :article_relationships

  has_many :articles,
    :through => :article_relationships
end

在几个SQL查询中(即,以“高效的方式”,可能通过使用Ruby on Rails includes()方法)我想检索categories和{ {1}} 或同时category_relationshipsarticles

我该怎么做?


P.S。:我正在改进如下的查询:

article_relationships

1 个答案:

答案 0 :(得分:0)

你可以做到

Article.includes(:category_relationships => :categories).find(1)

这将减少到3个查询(每个表1个)。为了提高性能,还要确保外键具有索引。

但总的来说,我很好奇为什么“category_relationships”实体存在,为什么这不是一个has_and_belongs_to的情况呢?

<强>更新

根据您更改的问题,您仍然可以

Category.includes(:article_relationships => :articles).first

如果你观看控制台(或尾部日志/开发),你会看到当你调用关联时,它会点击缓存的值并且你是金色的。

但我仍然很好奇为什么你没有使用Has和Belongs To Many协会。