Rails - ActiveRecord查询 - 查找relationship.count至少为1的第一项

时间:2012-03-13 18:37:38

标签: ruby-on-rails activerecord

我有两种模式:

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

我正在尝试找到至少有一条评论的最新帖子。

我试过了:

@post = Post.find_by_sql("SELECT *, count(comment.id) AS num_of_comments
  FROM post
  INNER JOIN comment ON post.id = comment.post_id
  WHERE num_of_comments >= 1").last

但是错误地说num_of_comments是一个未知的列。

然后我在Post上尝试了一种方法,但这不起作用:

def self.has_been_commented
  where("comments.count <= 1")
end

然后我开始研究范围,并看到.joins方法,但不知道我怎么能指定另一个过滤器。 类似的东西:

scope :has_been_commented, joins(:comments)

但是我不确定如何指定where(:comments.count&gt; = 1)

抱歉,如果这令人困惑......

2 个答案:

答案 0 :(得分:0)

你有多个comments和单数comment混合在一起。如果您遵循“Rails方式”,那么一切都将是复数,甚至是数据库名称,除了您的类名。目标是确保生成的SQL与您拥有的数据库表匹配。

答案 1 :(得分:0)

我找到了问题的答案:

Post.find(:all, :joins => "INNER JOIN comment ON comment.post_id = post.id", .
  :select => "post.*, count(comment.id) comment_count", 
  :group => "comment.post_id HAVING comment_count >= 1").last