2012-04-05 35 views
0

在我的紅寶石的模型我有一個模型has_and_belongs_to_many關係「搜索」:collection.exists?謊言對我

has_and_belongs_to_many :searches 

我要添加新的搜索對象只有在沒有已經存在了,所以我寫了:

def append_unless_already_there search 
    unless searches.exists?(search) 
    searches << search 
end 

但是,添加2次新對象傳遞條件,並導致sql異常。試圖用search.id替換搜索,但不改變任何內容。 我添加了一些記錄到代碼:

def append_unless_already_there search 
    puts "" 
    puts searches.exists?(search) 
    unless searches.exists?(search) 
    puts "[" 
    searches.each do |s| 
     puts s.id 
    end 
    puts "]" 
    puts search.id 

    searches << search 
    end 
end 

添加5名的檢索對象,其中最後2是相等的,結果在下面的日誌記錄添加的最後一個對象時:

false 
[ 
12 
5 
8 
1 
] 
1 

正如我讀給出的文件和例子,這最後的存在?檢查應該返回true。我無法弄清楚我在這裏錯過了什麼。提前致謝。

回答

1

嘗試:

(searches << search) unless searches.include?(search) 

OR

(searches << search) if !searches.include?(search) 

EDITED

我不是100%肯定,但 的情況下存在需要ID或某個值:

exists?(id = false) 

但在的情況下,包括,它也需要密鑰或對象:

include?(key) 

對於更多的細節檢查http://api.rubyonrails.org/

+0

是的。這是訣竅。謝謝!仍然好奇爲什麼存在?沒有工作,而它應該根據API來完成。非常感謝。 – Jos 2012-04-05 10:51:04

+0

看看我的編輯部分 – Vik 2012-04-05 11:01:36

+0

mm,嘗試過search.exists?(id = search.id)並添加了puts命令。在方法的第一行存在?(id = search.id)。這會記錄5次錯誤(而第5個應爲true)並引發ConstraintException。 – Jos 2012-04-05 11:11:49

2

exists?不採取ActiveRecord::Base對象,它需要一個ID(或ID等的列表,請參閱API Docs以獲取更多信息

所以要測試存在你想做的事:

searches.exists?(search.id) 

而不是:

searches.exists?(search) 
+0

感謝您的快速反應,並幫助克里斯。但是,在發佈之前,我確實已經嘗試過了(受鏈接的API中的示例的啓發)。在閱讀你的答案後,我再次嘗試了幾次,但同樣的事情發生了。無論是使用「搜索」還是「search.id」,記錄也是相同的。 – Jos 2012-04-05 10:07:29

+0

嗯有趣。剛剛測試過自己,似乎存在?將採用Model對象。你每天學習新的東西!你看過正在生成的SQL查詢,以確保它們正在做你期望的嗎? – 2012-04-05 10:39:38

+0

沒有那樣做。試圖在調試中使用步進過濾器進行清除,但是還沒有找到任何東西。正如維克在下一篇文章中所說,包括?做這項工作。仍然有趣爲什麼存在?纔不是。謝謝你的幫助。 – Jos 2012-04-05 10:53:38