ループを使用して、squeel を使用して次の構文を再作成しようとしています。
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 でこれらのフィールドの条件を避ける方法を探しています。上で述べたように、フィールドが空の場合はまったくリストしませんが、値がある場合はすべてを実行する必要がありfield = value OR field IS NULL
ます。
どんな助けでも大歓迎です。
編集:
現時点で使用しようとしているコード全体は次のとおりです。
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)
。
詳細情報:
非常に奇妙なことの 1 つは、 以外のものを使用するk,v
と無視されることです。例えば:
entry.each { |k,v| ((k == "bob") | (k == v)) }
「ボブ」は無視されます!OR
値 (v) は、ステートメントなしで SQL に入れられます。