我有user
,has_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时,我仍然会进行查询。
答案 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