Модель Rails находит, где не равна

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

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

Ответ 1

В 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 answer

Ответ 2

Рельсы 4

GroupUser.where.not(user_id: me)

Ответ 3

Единственный способ, которым вы можете получить его, - это MetaWhere.

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

GroupUser.where{user_id != me}

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

Ответ 4

Рельсы 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)

Ответ 5

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

Ответ 6

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

Ответ 7

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

GroupUser.where("user_id != ? OR user_id IS NULL", me)