답변:
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자체를 사용하는 경우 ( 예 : a scope) arel_table[:user_id]대신GroupUser.arel_table[:user_id]
@jbearden의 답변에 Rails 4.0 구문 크레딧
GroupUser.where(other_condition: true).where.not(user_id: user_id)
더 멋진 방법은 MetaWhere 입니다.
MetaWhere에는 다음 과 같은 코드를 허용하는 Squeel 이라는 새로운 사촌 이 있습니다.
GroupUser.where{user_id != me}
이것이 유일한 리 팩터라면 보석을 사용할 가치가 없으며 나는 당신이 얻은 것을 고수 할 것입니다. Squeel은 Ruby 코드와 상호 작용하는 많은 복잡한 쿼리가있는 상황에서 유용합니다.
레일 4 :
당신이 사용하려는 경우 모두 동일과 동일하지, 당신은 사용할 수 있습니다 :
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에 따르면 쿼리 방법 not이 추가되었습니다.
GroupUser.where.not(user: me)