Risposte:
In Rails 4.x (vedi http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions )
GroupUser.where.not(user_id: me)
In Rails 3.x
GroupUser.where(GroupUser.arel_table[:user_id].not_eq(me))
Per ridurre la lunghezza, è possibile memorizzare GroupUser.arel_table
in una variabile o se si utilizza all'interno del modello GroupUser
stesso, ad es. In a scope
, è possibile utilizzare arel_table[:user_id]
anzichéGroupUser.arel_table[:user_id]
Credito sintassi Rails 4.0 alla risposta di @ jbearden
GroupUser.where(other_condition: true).where.not(user_id: user_id)
L'unico modo per renderlo più elaborato è con MetaWhere .
MetaWhere ha un cugino più recente che si chiama Squeel che consente un codice come questo:
GroupUser.where{user_id != me}
Inutile dire che se questo è l'unico refattore che stai per creare, non vale la pena usare una gemma e rimarrei solo con quello che hai. Squeel è utile in situazioni in cui hai molte query complesse che interagiscono con il codice Ruby.
Rotaie 4:
Se si desidera utilizzare entrambi non uguali e uguali, è possibile utilizzare:
user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
Se si desidera utilizzare una varietà di operatori (ad es. >
, <
), Ad un certo punto è possibile passare da una notazione all'altra:
GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
?
Dovresti sempre includere il nome della tabella nella query SQL quando hai a che fare con le associazioni.
Infatti se un'altra tabella ha la user_id
colonna e si uniscono entrambe le tabelle, si avrà un nome di colonna ambiguo nella query SQL (ovvero problemi).
Quindi, nel tuo esempio:
GroupUser.where("groups_users.user_id != ?", me)
O un po 'più prolisso:
GroupUser.where("#{table_name}.user_id IS NOT ?", me)
Nota che se stai usando un hash, non devi preoccuparti perché Rails se ne prende cura per te:
GroupUser.where(user: me)
In Rails 4, come detto da @ dr4k3, not
è stato aggiunto il metodo di query :
GroupUser.where.not(user: me)