2010-06-24 3 views
0
params[:codes] = "9,10" 
    @result = Candidate.find :all, 
     :joins => 
      params[:codes].split(',').collect {|c| ["INNER JOIN candidates_codes on candidates_codes.candidate_id = candidates.id, INNER JOIN codes on codes.code_id = candidates_codes.code_id AND codes.value = ?", c]} 

오류레일 - 발견의 부울 연산자

Association named 'INNER JOIN candidates_codes on candidates_codes.candidate_id = candidates.id, INNER JOIN codes on codes.code_id = candidates_codes.code_id AND codes.value = ?' was not found; perhaps you misspelled it? 

업데이트

CREATE TABLE `candidates` (
 `id` int(11) NOT NULL auto_increment, 
`first_name` varchar(255) collate utf8_unicode_ci default NULL, 
`last_name` varchar(255) collate utf8_unicode_ci default NULL, 
`mobile_number` varchar(255) collate utf8_unicode_ci default NULL, 
`address` text collate utf8_unicode_ci, 
`country` varchar(255) collate utf8_unicode_ci default NULL, 
`created_at` datetime default NULL, 
`updated_at` datetime default NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ; 

    CREATE TABLE `candidates_codes` (
    `candidate_id` int(11) default NULL, 
    `code_id` int(11) default NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE `codes` (
`id` int(11) NOT NULL auto_increment, 
`section` varchar(255) collate utf8_unicode_ci default NULL, 
`value` varchar(255) collate utf8_unicode_ci default NULL, 
`created_at` datetime default NULL, 
`updated_at` datetime default NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11 ; 

안녕,

나는 "수를 ether"OR "또는 수있는 발견을 만들려고하고 있어요 AND "

예를 들어 (의사 코드)

array a = (1,2) 
array b = (1) 

find(1 AND 2) = array a 
find(1 OR 2) = array a, array b 

내 코드는 현재 다음과 같습니다 -

@result = Code.all :joins => :candidates, 
     :conditions => ["codes.id IN (?)", params['searches'][:Company]], 
     :select => "candidates.*" 

코드가 후보를 설명하는 코드의 전체 테이블, HABTM 관계가 코드와 후보

유일한 방법의 사이에 존재입니다 사용하여 가이드에서 두 열 사이에 볼 수 있습니다 ..

많은 감사합니다

알렉스

+0

'@ 결과'가 정확히 무엇을 원하겠습니까? –

+0

두 테이블의 스키마를 게시 할 수 있습니까? 또한 귀하의 AND에서 수정본이나 다양한 용어를 사용합니까? – aceofspades

+0

선택한 코드와 연결된 응시자. 용어의 수는 가변적입니다. 위 스키마를 추가했습니다. – Alex

답변

1

연결이 조인 테이블로 수행되므로 AND를 수행하려면 AND의 각 용어에 대해 한 번 INNER JOIN이 필요합니다. 당신이하려고하는 것은 에 대한 매핑을 가진 주어진 후보자를 찾으십시오. 모든 코드는입니다.

각 용어에 대해 가입해야 할뿐만 아니라 값과 같은 필드에서 일치하는 경우 코드 테이블에도 다시 가입해야하므로 혼란 스러울 수 있습니다. 용어의 수를 가정

너무 높지 않고, 당신은 PARAMS 전달 [: 코드] = "1,5,9-", 당신은 codes.value에 일치하도록 노력하고 있음 :

Candidate.find :all, 
    :joins => 
     params[:codes].split(',').collect {|c| "INNER JOIN candidates_codes#{c} on candidates_codes#{c}.candidate_id = candidates.id INNER JOIN codes#{c} on codes#{c}.id = candidates_codes#{c}.code_id AND codes#{c}.value = c"} 

... 또는 이와 비슷한 것입니다. 내가 그 코드를 테스트하지는 않았지만 그것이 당신이 찾고있는 것이라면 그것이 소용돌이 치게해라.

참고 조인에서 지원하지 않으므로 마지막 rev (여기서?는 변수로 대체)에서 대체를 제거했습니다. 먼저 매개 변수를 살균해야합니다 (즉, 정수인지 확인하십시오). 또는 모델에서 보호 된 sanitize_sql 메소드를 사용해야합니다.

+0

답장을 보내 주셔서 감사합니다! # {c} 부분이있는 부분과없는 부분이있는 오류 메시지가 표시됩니다. 코드와 함께 원래 메시지에 넣었습니다. – Alex

+0

위의 업데이트 된 조인을 약간 변경했습니다. # {c} 표기법을 제거 했습니까? 이 문제는 여러 AND 조건을 해결하고 고유하게 이름을 지정하기 위해 필요합니다. – aceofspades

+0

죄송하지만 여전히 같은 오류가 발생합니다. 조인 문을 분리해야합니까? – Alex