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)

更多信息: 一件非常奇怪的事情是,如果我使用除它之外的任何东西,k,v它就会被忽略。例如:

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

“鲍勃”被忽略了!OR并且值 (v) 在没有语句的情况下被放入 SQL中。

4

2 回答 2

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 回答
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

这很丑陋,但它有效。现在我确信有一种更好的方法可以将所有这些都写or's在第 3 行,但这是另一个问题 :)

于 2012-11-02T12:23:55.140 回答