2013-02-14 2 views
0

Учитывая канонический пример:ActiveRecord охват в зависимости от количества внешних ключей

class Post < ActiveRecord::Base 
    has_many :comments 
end 

class Comments < ActiveRecord::Base 
    belongs_to :post 
end 

Я хотел бы вернуть сферу (т.е. ActiveRecord::Relation) всех сообщений, которые имеют X или меньше комментариев; используя либо Active Record Query Interface, Arel, либо что-то еще, если оно решает мою проблему.

псевдокод:

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

Я знаю, что это может быть сделано в Ruby, с помощью простого Enumerable#select. Предпочтительно рассчитываться в базе данных, так как на самом деле может быть только одна Модель, которая удовлетворяет предикату.

ответ

1

Вы можете сделать что-то вроде этого ..

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

Ее не совсем полностью Арел, но это, конечно, работать

+0

Имея это то, что я искал! Полный isl ('.group (...). Имеющий (...)' код чрезвычайно многословный, предлагающий небольшую дополнительную выгоду. –

1

насчет этой области:

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

Это будет сделано все стороны базы данных. Он не использует соединение, так что вы можете обновить эти почтовые записи, если это необходимо