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