найти все, что ноль в ассоциации - PullRequest
12 голосов
/ 09 февраля 2011

Итак, у меня есть сообщение и пользователь.
У пользователя has_many есть пользователь, а пользователь принадлежит к сообщению.
Мне нужна находка, которая найдет все сообщения, у которых нет пользователей, таких как:

Post.first.users
 => [] 

Ответы [ 7 ]

27 голосов
/ 09 февраля 2011
Post.where("id not in (select post_id from users)")
17 голосов
/ 10 апреля 2014

Узнал это только сегодня:

Post.eager_load(:users).merge(User.where(id: nil))

Работает как минимум с Rails 4+.

Обновление:

В Rails 5+ вы можете использовать left_joins вместо:

Post.left_joins(:users).merge(User.where(id: nil))
2 голосов
/ 25 марта 2014

Я знаю, что это помечено как Rails 3, но если вы используете Rails 4, я делал это следующим образом.

Post.where.not(user_id: User.pluck(:id))
2 голосов
/ 09 февраля 2011

что-то в этом роде:

p = Post.arel_table
u = User.arel_table

posts = Post.find_by_sql(p.join(u).on(p[:user_id].eq(u[:p_id])).where(u[:id].eq(nil)).to_sql) 
2 голосов
/ 09 февраля 2011

Если вам нужно что-то быстрое, используйте оператор SQL, например:

SELECT * 
FROM posts p 
LEFT OUTER JOIN users u ON p.id = u.post_id 
WHERE u.id IS null
1 голос
/ 09 февраля 2011

Я думаю, что sql с in может вызвать проблемы с производительностью, если таблица базы данных имеет много строкосторожнее с этим

1 голос
/ 09 февраля 2011

Post.first.users.empty? должно быть достаточно, если пользователь возвращает массив.

Если вы хотите проверять каждое сообщение, вы можете сделать

Post.each do |p|
  if p.users.empty?
    do whatever
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...