如何在Rails中自动包含关联以不必要地停止查询?

时间:2013-12-28 19:34:08

标签: ruby-on-rails ruby-on-rails-3 rails-activerecord

我有userhas_one :user_profile。这些用户中的每一个都有经验值。现在我必须加载前10位用户并显示他们针对性别的照片。但性别属于user_profile模型。我如何立即获得user_profile?我正在经历比我认为必要的更多查询。基本上我想要一个select * from users where user_profile.user_id = user.id或类似的东西,所以当我需要获得user.user_profile.sex时,我不会再次查询数据库。我该怎么做?

目前在模型中尝试User.order("experience DESC").limit(limit).offset(offset).joins(:user_profile)但是当我在视图中查询user.user_profile.sex时,我仍然会进行查询。

2 个答案:

答案 0 :(得分:3)

您正在寻找的是“包含”,在http://apidock.com/rails/ActiveRecord/QueryMethods/includes

中有所描述

包含允许急切加载,将1 + n数据库调用减少到2个调用...

答案 1 :(得分:0)

您正在寻找的是“急切加载”,默认情况下,一对一关联是急切加载的,但您最好检查一下。
如果是多对一或多对多,您可以通过以下命令显式请求预先加载:

Client.includes(:address).find(some_id)
# or any other query like
Client.includes(:address).where(id: some_id, name: "Some Name")

如果您希望始终使用预先加载但未在模型中明确指定,则应编写:

class Customer < ActiveRecord::Base
  has_many :orders, -> { includes :line_items }
end

可以找到更多示例herehere