2016-12-17 1 views
0

배열을 통해 전달 된 모든 매개 변수와 일치하는 결과를 반환하는 ActiveRecord Postgres 쿼리가 있어야합니다.레일스 모든 파라미터와 일치하는 ActiveRecord 쿼리

일부 배경 : 많은 주제 (특집을 통해)가있는 사용자 모델이 있습니다. 토픽 ID를 문자열 (Parameters: {"topics"=>"1,8,3"})으로 전달한 다음 배열로 바꾸어 결국 topic_params = ["1","8","3"]으로 끝납니다.

이제 모든 주제와 일치하거나 모두 포함하는 모든 사용자를 반환하려고합니다. this question에 답을 수행 한 후, 나는이 함께 주제와 일치 사용자 반환 관리 :

@users = User.includes(:topics, :organization).where(:topics => {:id => topic_params}) 

을하지만 경기 결과를 반환 할 필요합니다. 나는 또한 전반적으로 이런 종류의 작업을 수행하는 더 나은 방법에 대해서 공개 할 것입니다.

+0

http://stackoverflow.com/questions/11636061/matching-all-values-in-in-clause – Iceman

+0

@Iceman, 링크를 제공해 주셔서 감사합니다. 이 인스턴스에서 어떻게 ActiveRecord 형식으로 작성합니까? – Andrew

+0

ActiveRecord에는 도움이되는'having' 및'to_sql' 메소드가 있습니다. –

답변

2

한 가지 방법은이

User.joins(:topics).where(topics: { id: [1, 2, 3] }).group('users.id').having('count(distinct topics.id) = 3') 

같은 것이 분명 내가이없는 정확한 스키마 당신이 그것을 조금 조정할해야 할 수도 있습니다, 그러나 이것은 기본 설정하므로.

중요한 점은 having 절 카운터가 일치하는 항목의 개수와 일치해야한다는 것입니다.

+0

일치시킬 항목 수가 가변적이라는 것을 어떻게 반영합니까? 1에서 최대 10까지의 범위를 가질 수 있음을 의미합니다 (3으로 설정되는 것과 반대). – Andrew

+0

('count (distinct topics.id) =?', topic_params.split (','). count) 또는 그와 비슷한 것 – Iceman

+0

괜찮습니다. 이 중 하나 더 많은 부분 : 가능하다면 다른 테이블을 열렬하게로드 할 수있는 방법이 있기 때문에 가능합니다. – Andrew

관련 문제