从ActiveRecord中的联接表中进行选择

时间:2013-11-05 21:07:47

标签: ruby-on-rails activerecord

我有以下型号

class Forum < ActiveRecord::Base
  has_many :topics
end

class Topic < ActiveRecord::Base
  belongs_to :forum
  has_many :posts
end

class Posts < ActiveRecord::Base
  belongs_to :topic
  belongs_to :user
end

我想加入这些关联(在主题和帖子上有一些条件),所以我做Topic.joins(:forum, :posts).where(some condition),但我想访问所有三个表中的属性。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以像这样进行多重连接。所有这三个表都可用,您只需要在表格中指定。

Topic.joins(:forum, :posts).where('topics.foo' => 'bar').where('posts.whizz' => 'bang)

两个警告是,这是一个多重内部联接,所以主题将需要同时显示论坛和帖子以及哪里是一起的。对于外连接或'或'逻辑在哪里你必须得到更好的。但是你可以为.joins和.where编写sql来实现这一点。使用.includes而不是.joins是另一种获得外部联接行为的方法 - 但当然你可能会加载很多记录。

澄清下面的评论,并显示其他用户建议语法的改进(更多rails-y)语法:

topics = Topic.joins(:forum, :posts).where(topic: {foo: 'bar'}).where(posts: {whizz: 'bang'})
topics.each do |t|
   puts "Topic #{t.name} has these posts:"
   t.posts.each do |p|
     puts p.text
   end
end