Рельсы Модель найти где не равны - PullRequest
127 голосов
/ 25 марта 2011

Как я могу найти записи в моей базе данных при неравных условиях? У меня есть это сейчас, но есть ли причудливый способ говорить по рельсам?

GroupUser.where('user_id != ?',me)

Ответы [ 7 ]

225 голосов
/ 12 сентября 2011

In 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, например, в scope, вы можете использовать arel_table[:user_id] вместо GroupUser.arel_table[:user_id]

Синтаксис Rails 4.0 для ответа @ jbearden

38 голосов
/ 09 мая 2013

Рельсы 4

GroupUser.where.not(user_id: me)
27 голосов
/ 25 марта 2011

Единственный способ сделать его более привлекательным - MetaWhere .

MetaWhere имеет более новую двоюродную сестру, которая называется Squeel , которая допускает такой код:

GroupUser.where{user_id != me}

Само собой разумеется, что если это единственный рефакторинг, который вы собираетесь создать, не стоит использовать драгоценный камень, и я бы просто придерживался того, что вы получили. Squeel полезен в ситуациях, когда у вас много сложных запросов, взаимодействующих с кодом Ruby.

21 голосов
/ 08 сентября 2014

Rails 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)
15 голосов
/ 25 марта 2011

То, что у вас есть, довольно хороший способ Rails 3 сделать это, я думаю.

8 голосов
/ 18 мая 2013

Вы должны всегда включать имя таблицы в запрос 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)
6 голосов
/ 28 января 2015

В Rails 3 я не знаю ничего более причудливого. Тем не менее, я не уверен, что, если вы знаете, ваше неравное условие не соответствует значениям (user_id) NULL. Если вы хотите этого, вам нужно сделать что-то вроде этого:

GroupUser.where("user_id != ? OR user_id IS NULL", me)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...