假设我的数据库中有一条记录,如
+----+-----------+----------+
| id | firstname | lastname |
+----+-----------+----------+
| 1 | 'Bill' | nil |
+----+-----------+----------+
(注意姓氏为零)
我是否可以使用以下哈希结构作为搜索参数检索上述记录:
vals = {firstname: "Bill", lastname: "test"}
Table.where(vals)
(即:找到最接近的匹配,忽略表中的nil列值)
(我考虑单独检查哈希中的每个键,并在找到匹配时停止,但只是想知道是否有更有效的方法,特别是对于更大的表)
答案 0 :(得分:3)
您可以进行自定义搜索。
def self.optional_where params
query_params = params.keys.map do |k|
"(#{k} = ? OR #{k} IS NULL)"
end.join(" AND ")
where(query_params, *params.values)
end
然后你会像
一样使用它Table.optional_where(vals)
这将产生下一个查询
SELECT "tables".* FROM "tables" WHERE ((firstname = 'Bill' OR first_name IS NULL) AND (lastname = 'test' OR last_name IS NULL))
答案 1 :(得分:0)
让我们像这样进行自定义搜索:
scope :custom_search, -> (params) {
params.each do |k, v|
params[k] = if
if v.is_a? Array
(v << nil).uniq
else
[v, nil]
end
where(params)
end
}
然后我们使用它:
search_params = {firstname: "Bill", lastname: "test"}
Table.custom_search(search_params)
生成的sql将是:
SELECT * FROM tables where firstname IN ['Bill', null] AND lastname IN ['test', null]
这意味着你不关心一个或多个字段是否为