2010-02-10 37 views
2

我有一個表叫inbox_messages具有以下行:奇怪的行爲,而使用SQL條件

user_id message_id 
======= ========== 
4  8 
4  1 
4  7 
0  9 
0  10 
0  11 
0  12 

表映射到以下模式:

class InboxMessage < ActiveRecord::Base 
end 

當我調用find方法與IN caluse,我得到不同的結果集取決於參數的位置 。

InboxMessage.find(:all, :conditions => [ "user_id IN (?)", "0,4"]) # 8 rows 
InboxMessage.find(:all, :conditions => [ "user_id IN (?)", "4,0"]) # 3 rows 

上述第二個電話,返回3行,而不是8其他方案正常工作,即

InboxMessage.find(:all, :conditions => [ "user_id IN (0, 4)" ]) # 8 rows 
InboxMessage.find(:all, :conditions => [ "user_id IN (4, 0)" ]) # 8 rows 
InboxMessage.find(:all, :conditions => [ :user_id => [0, 4] ]) # 8 rows 
InboxMessage.find(:all, :conditions => [ :user_id => [4, 0] ]) # 8 rows 

回答

4

的問題是,字面被傳遞到SQL語句中作爲一個單一的文字。

InboxMessage.find(:all, :conditions => [ "user_id IN (?)", "0,4"]) 
becomes Select ... WHERE (user_id IN ('4,0')) 

嘗試使用兩個換人,也將努力爲您想到

InboxMessage.find(:all, :conditions => [ "user_id IN (?, ?)", 0,4]) 
becomes Select ... WHERE (user_id IN (4,0)) 

你可以看到實際的SQL語句是通過查看日誌中的發展模式是什麼。

+0

我認爲你是對的。混亂的原因是,當我更改綁定參數順序時,我得到了預期的結果。我設法看到了SQL,並且它是錯誤的(如您注意到的)。 (PS:我使用「SQL_DISPLAY」:http://github.com/radar/sql_display插件列出SQL) – 2010-02-10 04:13:54

0

這是一個不同的形式,我更喜歡用,因爲我覺得它更易讀:

InboxMessage.find_all_by_user_id([0,4]) 
+0

我在我的'find'調用中有多個參數。我簡化了示例代碼以便於閱讀。 – 2010-02-10 04:00:54