Antworten:
In Rails 4.x (Siehe 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))
Um die Länge zu verkürzen, können Sie GroupUser.arel_table
in einer Variablen speichern oder bei Verwendung innerhalb des Modells GroupUser
selbst, z. B. in a scope
, arel_table[:user_id]
anstelle von verwendenGroupUser.arel_table[:user_id]
Rails 4.0-Syntax wird der Antwort von @ jbearden gutgeschrieben
GroupUser.where(other_condition: true).where.not(user_id: user_id)
Die einzige Möglichkeit, es schicker zu machen, ist mit MetaWhere .
MetaWhere hat einen neueren Cousin namens Squeel, der Code wie diesen zulässt:
GroupUser.where{user_id != me}
Es versteht sich von selbst, dass es sich nicht lohnt, einen Edelstein zu verwenden, wenn dies der einzige Refaktor ist, den Sie herstellen werden, und ich würde einfach bei dem bleiben, was Sie haben. Squeel ist nützlich in Situationen, in denen viele komplexe Abfragen mit Ruby-Code interagieren.
Schienen 4:
Wenn Sie sowohl ungleich als auch gleich verwenden möchten , können Sie Folgendes verwenden:
user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
(. Das heißt , wenn Sie eine Vielzahl von Operatoren verwenden möchten >
, <
), an einem gewissen Punkt können Sie Notationen der folgenden wechseln:
GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
?
Sie sollten den Tabellennamen immer in die SQL-Abfrage aufnehmen, wenn Sie sich mit Zuordnungen befassen.
Wenn eine andere Tabelle die user_id
Spalte enthält und Sie beide Tabellen verbinden, haben Sie in der SQL-Abfrage einen mehrdeutigen Spaltennamen (dh Probleme).
Also, in Ihrem Beispiel:
GroupUser.where("groups_users.user_id != ?", me)
Oder etwas ausführlicher:
GroupUser.where("#{table_name}.user_id IS NOT ?", me)
Beachten Sie, dass Sie sich darüber keine Gedanken machen müssen, wenn Sie einen Hash verwenden, da Rails dies für Sie erledigt:
GroupUser.where(user: me)
In Rails 4 wurde, wie von @ dr4k3 angegeben, die Abfragemethode not
hinzugefügt:
GroupUser.where.not(user: me)