Rails加入2个表

时间:2014-10-13 04:07:10

标签: activerecord ruby-on-rails-4

我有3张桌子

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

现在我想检索特定用户的所有评论。 我尝试使用像

这样的find_by_sql
Comment.find_by_sql "SELECT c.* FROM comments c, posts p, users u WHERE c.post_id = p.id and p.user_id = u.id and u.id=6"

这很好用。但我想从“帖子”表中找到一些细节以及评论。

有谁知道该怎么做?

1 个答案:

答案 0 :(得分:1)

更正了答案..

现在我已经正确地理解了这个场景,我之前回答的部分内容仍然有意义:

如此改变User模型:

class User < ActiveRecord::Base
  has_many :posts
  has_many :comments, through: :posts
end

这种类型的关系将在帖子的评论之间执行联接,其中帖子的user_id是当前用户。很简单,就像你在评论中所说的那样,&#34;用户和评论之间的联系[是] 通过发布&#34;

与我之前所说的相似,此场景中的Universe中心是用户对象。通过此添加,获取所有用户的评论将只是:

user.comments

如果查看日志,则SQL输出为:

SELECT `comments`.* FROM `comments` INNER JOIN `posts` ON `comments`.`post_id` = `posts`.`id` WHERE `posts`.`user_id` = 1

与原始查询类似。

现在您检索了此用户的评论,您可以像往常一样通过Post关系访问belongs_to :post模型数据。

最后,除非你有一些特殊的理由试图在纯SQL中做所有事情,否则这种方法更具可读性,可维护性和“#34; Rails方式”。此外,它还为您节省了大量麻烦和打字。

有关has_many ... through的更多信息。