Ответы:
В Rails 4.x (см. Http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions )
GroupUser.where.not(user_id: me)
В Rails 3.x
GroupUser.where(GroupUser.arel_table[:user_id].not_eq(me))
Чтобы сократить длину, вы можете сохранить GroupUser.arel_table
в переменной или, если вы используете внутри самой модели GroupUser
, например, в a scope
, вы можете использовать arel_table[:user_id]
вместоGroupUser.arel_table[:user_id]
Кредит синтаксиса Rails 4.0 для ответа @jbearden
GroupUser.where(other_condition: true).where.not(user_id: user_id)
Единственный способ сделать это лучше - с помощью MetaWhere. .
У MetaWhere есть новый двоюродный брат Squeel, который позволяет использовать такой код:
GroupUser.where{user_id != me}
Само собой разумеется, что если это единственный рефакторинг, который вы собираетесь сделать, не стоит использовать гем, и я бы просто придерживался того, что у вас есть. Squeel полезен в ситуациях, когда у вас есть много сложных запросов, взаимодействующих с кодом Ruby.
Рельсы 4:
Если вы хотите использовать как не равные, так и равные, вы можете использовать:
user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
Если вы хотите использовать различные операторы (например >
, <
), в какой-то момент вы можете захотеть переключить обозначения на следующие:
GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
?
При работе с ассоциациями всегда следует включать имя таблицы в запрос SQL.
Действительно, если в другой таблице есть user_id
столбец, и вы присоединитесь к обеим таблицам, у вас будет неоднозначное имя столбца в запросе SQL (т.е. проблемы).
Итак, в вашем примере:
GroupUser.where("groups_users.user_id != ?", me)
Или более подробно:
GroupUser.where("#{table_name}.user_id IS NOT ?", me)
Обратите внимание: если вы используете хеш, вам не нужно об этом беспокоиться, потому что Rails позаботится об этом за вас:
GroupUser.where(user: me)
В Rails 4, как сказал @ dr4k3, not
был добавлен метод запроса :
GroupUser.where.not(user: me)