2009-03-31 5 views
3

제가 모델을 가지고 있다고 가정 해 봅시다 : 사용자와 아이템, 그리고 그들 사이의 다 대다 관계. 정의 된 속성을 가진 항목이 더 이상없는 사용자, 즉 색상이있는 항목이있는 사용자 = [ 'red', 'black']를 얻는 방법.레일스에서 ​​has_many가 반전되었습니다.

는 물론 I는 다음과 같이 수행 할 수 있습니다

User.all :joins => [:items, :items], :conditions => {:"items.color" => "red", :"items_users.color" => 'black'} 

을하지만 더 속성에 대해 꽤 성가신 될 것입니다.

User.all(:conditions => ["items.color in (?), ['red', 'black']], :include => :items) 

을하지만이 사람은

그래서 유일한 솔루션입니다 [ '블루', '등', '레드', '블랙'] 항목 색상 =을 갖는 또한 사용자를 반환 또한 할 수있다 루비 문법으로 모두 정렬하려면? 하나의 SQL 쿼리 또는 Rails AR 구문에서이를 수행하는 방법은 무엇입니까? 내 의견으로는, 프로그래머 시간과 가독성을 최적화

답변

1

방법 :

#get all users who have items which are both red and black but no other colors 
candidate_users = User.all(:include => :items) 
candidate_users.reject! do |candidate| 
    candidate.items.map {|item| item.color}.sort != ['black', 'red'] 
end 

당신이 사용자의 통계 봐서 통해 반복 할 것으로 예상되는 경우에, 당신은 그것을 SQL해야합니다. 경고 : SQL은 내 가방이 아닙니다. 베이비 : 사용하기 전에 테스트하십시오.

1) 모든 사용자/아이템 조합 2) '을 의미합니다 정확히 2 독특한 색상

의 항목이 사용자에게 아래 Winnows 그랩 : 나는 악 엉망이하는 생각은 무엇

select users.*, items.* FROM users 
    INNER JOIN items_users ON (items_users.user_id = users.id) 
    INNER JOIN items ON (items_users.item_id = items.id) 
    GROUP BY users.id HAVING COUNT(DISTINCT items.color) = 2 

당신은 아마 여기에 완전히 루비에 대한 필요성을 제거 할 수 있지만, SQL은 추한의 일곱 개 맛을 얻을 것입니다

candidate_users.reject! do |candidate| 
    candidate.items.map {|item| item.color}.sort != ['black', 'red'] 
end 

: 필요 것이다. (Cross join, oh my ...)

+0

간단하지만 이것은 레일 규칙을 위반하고 체인에서 지연로드를 방지합니다 (이것이 '람다' –

관련 문제