回答:
Rails 4.xの場合(http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditionsを参照)
GroupUser.where.not(user_id: me)
Rails 3.x
GroupUser.where(GroupUser.arel_table[:user_id].not_eq(me))
長さを短くするにGroupUser.arel_table
は、変数に格納するか、モデルGroupUser
自体の内部(たとえば)でscope
使用する場合arel_table[:user_id]
は、GroupUser.arel_table[:user_id]
Rails 4.0構文は@jbeardenの答えに貢献しています
GroupUser.where(other_condition: true).where.not(user_id: user_id)
より洗練された方法は、MetaWhereを使用することです。
MetaWhereには、次のようなコードを許可するSqueelと呼ばれる新しいいとこがあります。
GroupUser.where{user_id != me}
言うまでもなく、これが唯一のリファクタリングである場合は、gemを使用する価値はなく、取得したものに固執します。Squeelは、Rubyコードとやり取りする複雑なクエリが多数ある状況で役立ちます。
Rails 4:
not equalとequalの両方を使用する場合は、以下を使用できます。
user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
さまざまな演算子(つまり>
、<
)を使用する場合は、ある時点で表記法を次のように切り替えることができます。
GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
ですか?
関連付けを処理するときは、常に SQLクエリにテーブル名を含める必要があります。
実際、別のテーブルにuser_id
列があり、両方のテーブルを結合すると、SQLクエリにあいまいな列名が含まれます(トラブルなど)。
したがって、あなたの例では:
GroupUser.where("groups_users.user_id != ?", me)
またはもう少し詳細:
GroupUser.where("#{table_name}.user_id IS NOT ?", me)
ハッシュを使用している場合は、Railsがハッシュを処理するため、そのことを心配する必要はありません。
GroupUser.where(user: me)
Rails 4では、@ dr4k3で述べたように、queryメソッドnot
が追加されました。
GroupUser.where.not(user: me)