我試圖通過使用循環再造使用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中。
你錯過了代碼中的一些行嗎?看來你的問題歸結爲:「如何使用squeel變量使用屬性名稱?」:'table.send(var)' – tokland
不,這不是我要求的,請參閱原始問題中的編輯以查看OR語句中的一個選項被忽略,我不明白爲什麼。 – kakubei