2010-06-30 3 views
3

У меня есть модель пользователя, которая has_many: posts. Если бы я хотел сделать named_scope для поиска пользователей с хотя бы одним сообщением, это было бы правильно?Named_scope хотя бы один в has_many ассоциации

named_scope :at_least_one_post, :joins => :posts, :group => "users.id" 

или я должен сделать шаг дальше и сделать

named_scope :at_least_one_post, :joins => :posts, :group => "users.id", :having => "COUNT(posts.id) > 0" 

ответ

4

На самом деле я не думаю, что это необходимо сгруппировать или добавить условие. Потому что вы используете :joins, который будет делать INNER JOIN и поэтому будет тянуть только пользователей с сообщениями. Если вы собираетесь сделать: include, то будет LEFT JOIN, и вам нужно будет добавить пункт HAVING.

Так все, что вам нужно нужно

named_scope :at_least_one_post, :joins => :posts 
+0

вы должны оставить в: группе, в противном случае, что происходит, когда есть больше чем один пост для пользователя? В вашем результирующем наборе вы получите много дубликатов записей пользователей из-за INNER JOIN. (если рельсы автоматически не отфильтровывают это для вас, я забыл - даже так, зачем возвращать необдуманные строки из db?) – dalyons

+0

ORM заботится о группировке даже на 'LEFT JOIN'. Если вы начнете группировать оператор 'GROUP BY', вам понадобится группировать или агрегировать каждый столбец в инструкции' SELECT'. –

+0

Есть ли простой способ найти пользователей с нулевыми сообщениями? – Chap

Смежные вопросы