在一个查询中从一个表中选择两个外键

时间:2015-06-20 16:46:52

标签: sql ruby-on-rails ruby activerecord arel

我有两张桌子:

User:
user_id

user_blogs:
user_id | blog_id

blogs:
blog_id | source | identifier

Comments:
source | identifier | Field3

我希望能够选择用户拥有的博客中的所有评论。

我的模型是相关的:

class User < ActiveRecord::Base
  has_many :user_blogs
  has_many :blogs, trhough: :user_blogs
end

class blogs < ActiveRecord::Base
  has_many :comments, 
           :foreign_key => :source,
           :primary_key => :source,
           :conditions => Proc.new {
              {:identifier=> self.identifier}
           }
end

现在我可以使用以下方法检索所有用户评论:

User.first.blogs.map{|b| b.comments}

但这会为每个博客创建一个查询。

有没有办法一步完成?

2 个答案:

答案 0 :(得分:1)

是的,您需要使用Rails eager_loading 功能。

u = User.includes(blogs: :comments)
# now you can do
u.first.blogs.map { |b| b.comments }

或者,您也可以修改模型关联定义:

class User < ActiveRecord::Base
  has_many :user_blogs
  has_many :blogs, -> { includes(:comments) }, through: :user_blogs
end

现在,您可以执行以下操作,而无需为每个blog点击多个查询。

User.first.blogs.map { |b| b.comments }

答案 1 :(得分:1)

class User < ActiveRecord::Base
  has_many :user_blogs
  has_many :blogs, through: :user_blogs
  has_many :comments, through: :blogs
end

class Blog < ActiveRecord::Base
  has_many :comments, -> { where(identifier: identifier) }, foreign_key : source, primary_key: source
end


User.find(ID).comments