我有两张桌子:
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}
但这会为每个博客创建一个查询。
有没有办法一步完成?
答案 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