Como posso encontrar registros no meu banco de dados em uma condição não igual? Eu tenho isso agora, mas existe uma maneira sofisticada de falar sobre trilhos?
GroupUser.where('user_id != ?',me)
Como posso encontrar registros no meu banco de dados em uma condição não igual? Eu tenho isso agora, mas existe uma maneira sofisticada de falar sobre trilhos?
GroupUser.where('user_id != ?',me)
Respostas:
No Rails 4.x (consulte http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions )
No Rails 3.x
Para encurtar o comprimento, você pode armazenar
GroupUser.arel_table
em uma variável ou, se estiver usando dentro doGroupUser
próprio modelo , por exemplo, em ascope
, você pode usar emarel_table[:user_id]
vez deGroupUser.arel_table[:user_id]
Crédito de sintaxe do Rails 4.0 na resposta de @ jbearden
fonte
GroupUser.where(other_condition: true).where.not(user_id: user_id)
Trilhos 4
fonte
A única maneira de torná-lo mais sofisticado é com o MetaWhere .
O MetaWhere possui um primo mais novo chamado Squeel, que permite códigos como este:
Escusado será dizer que, se este é o único refator que você vai fazer, não vale a pena usar uma gema e eu gostaria de ficar com o que você tem. Squeel é útil em situações em que você tem muitas consultas complexas interagindo com o código Ruby.
fonte
Trilhos 4:
Se você deseja usar os dois não iguais e iguais, você pode usar:
Se você quiser usar uma variedade de operadores (por exemplo
>
,<
), em algum momento, poderá mudar as notações para o seguinte:fonte
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
?Você sempre deve incluir o nome da tabela na consulta SQL ao lidar com associações.
De fato, se outra tabela tiver a
user_id
coluna e você juntar essas duas tabelas, terá um nome de coluna ambíguo na consulta SQL (ou seja, problemas).Então, no seu exemplo:
Ou um pouco mais detalhado:
Observe que se você estiver usando um hash, não precisará se preocupar com isso, porque o Rails cuida disso para você:
No Rails 4, como dito por @ dr4k3, o método de consulta
not
foi adicionado:fonte
No Rails 3, não conheço nada mais sofisticado. No entanto, não tenho certeza se você está ciente, sua condição não igual não corresponde aos valores (user_id) NULL. Se você quiser isso, terá que fazer algo assim:
fonte