레일스 모델이 같지 않은 곳을 찾습니다


127

동일하지 않은 조건에서 데이터베이스의 레코드를 어떻게 찾을 수 있습니까? 나는 지금 이것을 가지고 있지만, 그것을하는 멋진 레일 말하기 방법이 있습니까?

GroupUser.where('user_id != ?',me)

당신이 가진 것은 꽤 좋은 Rails 3 방식입니다.
스파이로

답변:


229

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 구문 크레딧


협회에서는 어떻습니까? -has_many : group_users,-> {where.not (status : "Declined")}, 통해 : : groups, foreign_key : "user_id"
ajbraus

4
사이드 참고로, 그것은 또한 잘 체인 작품 :GroupUser.where(other_condition: true).where.not(user_id: user_id)
엔리코 Carlesso에게


26

더 멋진 방법은 MetaWhere 입니다.

MetaWhere에는 다음 과 같은 코드를 허용하는 Squeel 이라는 새로운 사촌 이 있습니다.

GroupUser.where{user_id != me}

이것이 유일한 리 팩터라면 보석을 사용할 가치가 없으며 나는 당신이 얻은 것을 고수 할 것입니다. Squeel은 Ruby 코드와 상호 작용하는 많은 복잡한 쿼리가있는 상황에서 유용합니다.


4
MetaWhere는 훌륭하지만이 작업은 gem을 추가하지 않고도 수행 할 수 있습니다.
tybro0103 2016 년

1
@ tybro0103 물론 작업을 수행 할 수 있습니다 (OP 가하는 방식이 완벽합니다). 보석없이 더 멋지게 할 수 있다고 생각한다면 그렇게하는 방법에 관심이 많을 것입니다.
Jakub Hampl

Vikrant의 답변은 SQL과 관련이 없거나 다른 보석을 포함하지 않는 솔루션을 제공합니다. 그러나 나는 정정했다. 당신의 대답은 분명히 가장 코더 친화적 / 팬시입니다.
tybro0103 2016 년

1
그런 간단한 작업을 수행하기 위해 보석을 추가합니다. 바주카포로 mozzy를 치는
baash05

이것은 과잉입니다.
courtsimas

23

레일 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)?
Enrico Carlesso

@EnricoCarlesso 게시 해 주셔서 감사합니다. 귀하의 제안을 포함하도록 답변을 업데이트했습니다. 감사.
Rick Smith

9

당신은해야한다 항상 협회를 처리 할 때 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)

6

Rails 3에서는 더 멋진 것이 없습니다. 그러나 당신이 알고 있는지, 확실하지 않은 조건이 (user_id) NULL 값과 일치하지 않습니다. 원하는 경우 다음과 같은 작업을 수행해야합니다.

GroupUser.where("user_id != ? OR user_id IS NULL", me)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.