ActiveRecord范围基于外键的数量

时间:2013-02-14 19:14:42

标签: ruby-on-rails ruby rails-activerecord arel

鉴于规范的例子:

class Post < ActiveRecord::Base
  has_many :comments
end

class Comments < ActiveRecord::Base
  belongs_to :post
end

我想返回所有评论为X或更少的帖子的范围(即ActiveRecord::Relation);如果它解决了我的问题,请使用Active Record Query InterfaceArel或其他内容。

伪代码:

scope :quiet, lambda { |n| where(comments: { maximum: n }) }

我知道这可以通过简单的Enumerable#select在Ruby中完成。最好是在数据库上计算,因为实际上只能有一个模型满足谓词。

2 个答案:

答案 0 :(得分:1)

这个范围怎么样:

scope :quiet, ->(n) { where("(SELECT COUNT(*) FROM comments WHERE post_id = `posts`.id) < ?", n) }

它将在所有数据库端完成。它不使用连接,因此您可以根据需要实际更新这些帖子记录

答案 1 :(得分:1)

你可以这样做......

Post.joins(:comments).group("posts.id HAVING count(comments.id) > 0")

它不是完全的,但它肯定会起作用