Programing

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

crosscheck 2020. 7. 4. 10:46
반응형

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


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

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

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


레일 4

GroupUser.where.not(user_id: me)

더 멋진 방법은 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)

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

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

GroupUser.where("user_id != ? OR user_id IS NULL", me)

참고 URL : https://stackoverflow.com/questions/5426421/rails-model-find-where-not-equal

반응형