Respostas:
No Rails 4.x (consulte http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions )
GroupUser.where.not(user_id: me)
No Rails 3.x
GroupUser.where(GroupUser.arel_table[:user_id].not_eq(me))
Para encurtar o comprimento, você pode armazenar GroupUser.arel_table
em uma variável ou, se estiver usando dentro do GroupUser
próprio modelo , por exemplo, em a scope
, você pode usar em arel_table[:user_id]
vez deGroupUser.arel_table[:user_id]
Crédito de sintaxe do Rails 4.0 na resposta de @ jbearden
GroupUser.where(other_condition: true).where.not(user_id: user_id)
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:
GroupUser.where{user_id != me}
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.
Trilhos 4:
Se você deseja usar os dois não iguais e iguais, você pode usar:
user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
Se você quiser usar uma variedade de operadores (por exemplo >
, <
), em algum momento, poderá mudar as notações para o seguinte:
GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)
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:
GroupUser.where("groups_users.user_id != ?", me)
Ou um pouco mais detalhado:
GroupUser.where("#{table_name}.user_id IS NOT ?", me)
Observe que se você estiver usando um hash, não precisará se preocupar com isso, porque o Rails cuida disso para você:
GroupUser.where(user: me)
No Rails 4, como dito por @ dr4k3, o método de consulta not
foi adicionado:
GroupUser.where.not(user: me)