渴望加载同一模型的两个关联

时间:2012-03-14 08:16:47

标签: ruby-on-rails ruby

如何通过一个查询急切加载这些关联

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。* FROM pairs WHERE pairsid = 935029848 LIMIT 1

     

用户加载(4.3ms)SELECT users.id FROM users WHERE usersid IN(965902799)

     

用户加载(0.9ms)SELECT users.id FROM users WHERE usersid IN(274512568)

但我想得到:

  

配对加载(3.1ms)SELECT pairs。* FROM pairs WHERE pairsid = 935029848 LIMIT 1

     

用户加载(4.3ms)SELECT users.id FROM users WHERE usersid IN(965902799,274512568)

3 个答案:

答案 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