gpt4 book ai didi

ruby - Squeel 语法 for field = value OR field IS NULL in a loop

转载 作者:太空宇宙 更新时间:2023-11-03 16:54:39 25 4
gpt4 key购买 nike

我正在尝试通过循环使用 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 没有值 I甚至不会使用那条线)。

我有这个:

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

但它不会在 SQL 中放置 field IS NULL 位。

如果用 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)) }

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

最佳答案

如果我没理解错的话,你需要__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

关于ruby - Squeel 语法 for field = value OR field IS NULL in a loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13182077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com