2010-06-24 57 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 ; 

嗨,

我想創建一個找到能夠甲醚是 「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關係使用AND我可以在指南中看到的是兩列之間..

很多謝謝

Alex

+0

你究竟想要'@結果'是什麼? – 2010-06-24 17:16:15

+0

你可以發佈兩張表的模式嗎?另外,你會在你的AND中使用修復或可變數量的術語嗎? – aceofspades 2010-06-24 17:59:53

+0

與所選代碼鏈接的候選人。 術語的數量將是可變的。 我已經添加了上面的模式。 – Alex 2010-06-24 18:31:59

回答

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 2010-06-24 19:42:29

+0

對以上更新的連接進行了輕微更改。你是否消除了#{c}符號?這將是必需的,以便多個AND術語解析和唯一命名。 – aceofspades 2010-06-24 21:51:42

+0

對不起,說我仍然收到同樣的錯誤。連接語句是否需要分開? – Alex 2010-06-24 23:08:17