2012-11-01 32 views
2

我試圖通過使用循環再造使​​用squeel的語法如下:現場=值或字段Squeel語法是在一個循環NULL

WHERE season = "value" OR season IS NULL 

我能遠遠得到這樣的:

where do 
    ((season == entry["season"]) | (season == nil)) & 
    ((episode == entry["episode"]) | (episode == nil)) & 
    ((imdb == entry["imdb"]) | (imdb == nil)) & 
    (YEAR(theatrical) == year) 

然而,問題是,我想這樣做在一個循環,所以我不必爲當值是空做條件語句(例如,如果IMDB沒有價值我甚至不使用該行)。

我有這樣的:

entry = { "imdb"=>"0364725", "media"=>"DVD", "season"=>"1", ...} 
entry.each do |k,v| 
    ((k == v) | (k == nil)) 
    end 
end 

但是它並沒有把field IS NULL位的SQL。

如果Squeel不可能,可以用ActiveRecord完成嗎?

最終,我正在尋找一種避免在SQL中爲這些字段設置條件的方法。正如我上面所說,如果該字段爲空,我根本沒有列出它們,但如果它有一個值,我需要完成整個​​位。

任何幫助將不勝感激。

編輯:

整個代碼我想在目前使用的是這樣的:

matches_found = 
includes(:dvd_director, :dvd_upc, :dvd_series).limit(1). 
where do 
    (title == title_to_search) & 
    entry.each { |k,v| ((k == v) | (k == nil)) } 
end 

注意,|後,一切都越來越忽略我是否使用__send__(k)與否。

更多信息: 一個非常奇怪的是,如果我使用的任何其他比k,v它就會被忽略。例如:

entry.each { |k,v| ((k == "bob") | (k == v)) } 

「Bob」被忽略!並且值(v)在沒有OR語句的情況下被放入SQL中。

+0

你錯過了代碼中的一些行嗎?看來你的問題歸結爲:「如何使用squeel變量使用屬性名稱?」:'table.send(var)' – tokland

+0

不,這不是我要求的,請參閱原始問題中的編輯以查看OR語句中的一個選項被忽略,我不明白爲什麼。 – kakubei

回答

0

最終,唯一的解決辦法我能想出是添加nil到陣列本身Squeel來處理它正確:

entry.each do |k,v| 
    # we add a nill value so Squeel will do the OR field IS NULL 
    entry[k] = [v, nil] if k == "upc" || k == "asin" || k == "freebase" || k == "imdb" 
end 

這是醜陋的,但它的作品。現在我確信有一個更好的方法來寫第3行所有那些or's但這是另一個問題:)

0

如果我理解正確的話,你需要__send__

where do 
    (title == title_to_search) & entries.map do |k, v| 
    (__send__(k) == v) | (__send__(k) == nil) 
    # or: __send__(k) >> [v, nil] 
    end.inject(:&) 
end 

https://github.com/ernie/squeel/wiki/Tips-and-tricks

+0

我可以刪除table命令並仍使用'.send'嗎?我會試試看。簡單地說,因爲我在那裏加入,如果必須指定表格,會使事情複雜化。這些連接被更新的'.includes' – kakubei

+0

照顧,正確的方法是'__send__' – tokland

+0

這對我不起作用。無論是否使用'__send__',它都會忽略'|'後面的所有內容。如果我明確列出它們(如原始問題中的例子),它可以工作,但是一旦我將它放入循環中,OR部分就會被忽略。 – kakubei