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
我有两个桌子:
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