2012-03-25 50 views
0

好了,所以我有這個軌道3中嵌套條件

User.find(4).friends 

[#<Contact id: 67, type: nil, default_contact_group: false, primary_contact_id: nil, invitation_code: nil, flag_for_review: true, code_name: nil, reset_password_token: nil, 
....... 
....... 

User.find(4).friends.count 
=> 5 

User.find(4).friends.map(&:type) 
=> [nil, nil, nil, nil, nil] 

,你可以看到所有的類型字段是零,但是當我這樣做的where子句我不可能有返回

User.find(4).friends.where("type != 'ContactGroup'") 
=> [] 

User.find(4).friends.where(["type != ?", "ContactGroup"]) 
=> [] 

什麼時我做錯了,爲什麼它沒有返回記錄,這個地方明顯匹配

回答

2

我假設您的數據庫中的type列的值實際上是NULL

然後您現在觀察NULL值的一個有趣方面。 NULL與另一個值的比較結果既不是TRUE也不是FALSE,它的UNKNOWN。因此,在你的數據庫中,一個值與NULL的比較從來就不是真的,反之亦然。這就是爲什麼你在最後一次查詢中沒有看到任何結果。

爲了減輕這一點,有一個特殊的比較運算符:IS NULLIS NOT NULL。你可以這樣使用它從導軌:

User.find(4).friends.where(["type != ? or type IS NOT NULL", "ContactGroup"]) 
1

friends已經是一個數組,並且會迴應.select.

User.find(4).friends.select {|f| f.type != 'ContactGroup'} 

# Or .reject 
User.find(4).friends.reject {|f| f.type == 'ContactGroup'} 
+0

現在想象一下,朋友名單是巨大的。當你可以在數據庫中做到這一點時,你真的不想在Ruby中過濾它... – 2012-03-25 16:47:10

0

你不應該使用,因爲Rails的是如何實現單表繼承列名typeThis article explains in more detail

它仍然適用於Rails 3.在Rails 3控制檯中,當嘗試執行與您嘗試的操作相同的操作時,出現此錯誤。

ActiveRecord :: SubclassNotFound:單表繼承機制 未能找到子類:'test'。由於 列'type'被保留用於存儲類,所以在 繼承的情況下引發此錯誤。如果您不打算將其用於存儲繼承類的 或覆蓋 VideoFile.inheritance_column以針對該 信息使用另一列,請重命名此列。