如何通过一个查询急切加载这些关联
class Pair < ActiveRecord::Base
belongs_to :user
belongs_to :buddy, :class_name => "User"
end
class PairsController < ApplicationController
def show
@pair = Pair.includes(:user, :buddy).find(params[:id])
end
end
查询如下:
配对加载(3.1ms)SELECT
pairs
。* FROMpairs
WHEREpairs
。id
= 935029848 LIMIT 1用户加载(4.3ms)SELECT users.id FROM
users
WHEREusers
。id
IN(965902799)用户加载(0.9ms)SELECT users.id FROM
users
WHEREusers
。id
IN(274512568)
但我想得到:
配对加载(3.1ms)SELECT
pairs
。* FROMpairs
WHEREpairs
。id
= 935029848 LIMIT 1用户加载(4.3ms)SELECT users.id FROM
users
WHEREusers
。id
IN(965902799,274512568)
答案 0 :(得分:1)
我认为你现在不能在rails中做到这一点,因为默认情况下rails假定不同的关联具有不同的表,并且在急切加载时它不能将来自不同关联的包含组合到一个查询中,即使这些关联具有同桌。
更新:此外,我认为这样做甚至都不可行,因为如果你考虑一下你的数据关系:你试图加载一对用户和好友,当你这样做时2查询它非常简单,你知道谁是用户和谁是好友,但想想你用1个查询做的情况,你怎么知道检索到的记录是用户还是好友?没有办法知道100%。
答案 1 :(得分:0)
尝试@pair = Pair.joins(:user, :buddy).find(params[:id])
答案 2 :(得分:0)
我相信你可以做到这一点。在执行ActiveRecord查找时,您可以分别使用:include参数(Rails 2)或includes方法(Rails 3)。这是一个加载两个与博客相关联的模型的示例:标签和注释。评论还有一个嵌套的评论者:
# Rails 2
Blogpost.all(:include => [:tags, { :comments => :commenter }])
# Rails 3
Blogpost.includes(:tags, { :comments => :commenter }).all