2

ループを使用して、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 に入れられます。

4

2 に答える 2

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は別の質問です:)

于 2012-11-02T12:23:55.140 に答える
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

于 2012-11-01T17:48:49.163 に答える