Как найти записи в моей базе данных в не равных условиях? У меня есть это сейчас, но есть ли причудливые рельсы-говорящий способ сделать это?
GroupUser.where('user_id != ?',me)
Как найти записи в моей базе данных в не равных условиях? У меня есть это сейчас, но есть ли причудливые рельсы-говорящий способ сделать это?
GroupUser.where('user_id != ?',me)
В 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
Рельсы 4
GroupUser.where.not(user_id: me)
Единственный способ, которым вы можете получить его, - это 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)
То, что у вас есть, - это очень хороший способ Rails 3 сделать это, я думаю.
Вы должны всегда включать имя таблицы в запрос 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)
В Rails 3 я не знаю ничего любимого. Однако я не уверен, что вы знаете, ваше не равное условие не соответствует значениям (user_id) NULL. Если вы этого хотите, вам нужно будет сделать что-то вроде этого:
GroupUser.where("user_id != ? OR user_id IS NULL", me)