Select 来自一个 table,在单个查询中有两个外键

Select from one table with two foreign keys in a single query

我有两个桌子:

User:
user_id

user_blogs:
user_id | blog_id

blogs:
blog_id | source | identifier

Comments:
source | identifier | Field3

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

我的模型是相关的:

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}

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

有没有一种方法可以一步完成?

是的,您需要使用 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 }
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