Activerecord Rails在两个表上连接

Activerecord Rails在两个表上连接,activerecord,ruby-on-rails-4,Activerecord,Ruby On Rails 4,我有三张桌子,它们是 class User < ActiveRecord::Base has_many :posts end class Post < ActiveRecord::Base belongs_to :user has_many :comments end class Comment < ActiveRecord::Base belongs_to :post end 这个很好用。但我想从“posts”表中了解一些细节和评论 有人知

我有三张桌子,它们是

class User < ActiveRecord::Base
   has_many :posts
end

class Post < ActiveRecord::Base
   belongs_to :user   
   has_many :comments
end

class Comment < ActiveRecord::Base
   belongs_to :post
end
这个很好用。但我想从“posts”表中了解一些细节和评论

有人知道怎么做吗?

正确答案

现在我已经正确地理解了这个场景,我前面的部分答案仍然有意义,只添加了一个:

用户
模型更改如下:

class User < ActiveRecord::Base
  has_many :posts
  has_many :comments, through: :posts
end
如果查看日志,SQL输出为:

SELECT `comments`.* FROM `comments` INNER JOIN `posts` ON `comments`.`post_id` = `posts`.`id` WHERE `posts`.`user_id` = 1
这与原始查询类似

现在,您已检索到此用户的注释,您可以像往常一样通过
所属:Post
关系访问
Post
模型数据

最后,除非您有特殊的理由尝试使用纯SQL来完成所有工作,否则这种方法更具可读性、可维护性和“Rails方式”。此外,它还为您节省了大量的麻烦和打字


更多信息。

嗨,保罗,我相信用户和评论之间没有任何直接关系。“这只是通过帖子。”Maninderddy哦,非常抱歉,我误读了那部分。读得太快了。“让我重新审视这个问题。”曼宁德雷迪很高兴听到这个问题。别忘了“接受”答案(答案左边的绿色复选标记)。你能澄清一下吗:你说你想检索某个特定用户的所有评论,但正如你之前写的那样,
用户
和`Comment
之间没有直接联系。换句话说,该评论的作者信息丢失。您的查询最终检索用户创建的帖子的所有评论,但不一定检索用户发布的评论。我错过了什么;如果
User`和Comment之间没有直接联系,那就对了。我只想检索用户创建的帖子。我通过Post在用户和评论之间建立了联系。我觉得用户和评论之间没有任何直接关系的必要,因为在我的例子中,用户只是为他的帖子创建评论,而不是在其他帖子上发布。明白了,我现在明白了。很抱歉给你带来了困惑。看看我的答案,看看它现在是否更有意义。
user.comments
SELECT `comments`.* FROM `comments` INNER JOIN `posts` ON `comments`.`post_id` = `posts`.`id` WHERE `posts`.`user_id` = 1