【问题标题】:Rails4: Is it possible to do an optional ActiveRecord search?Rails4:是否可以进行可选的 ActiveRecord 搜索?
【发布时间】:2016-05-12 17:23:04
【问题描述】:
假设我的数据库中有一条记录,例如
+----+-----------+----------+
| id | firstname | lastname |
+----+-----------+----------+
| 1 | 'Bill' | nil |
+----+-----------+----------+
(注意姓氏为零)
是否有任何地方可以使用以下哈希结构作为搜索参数来检索上述记录:
vals = {firstname: "Bill", lastname: "test"}
Table.where(vals)
(即:查找最接近的匹配,忽略表中的nil列值)
(我正在考虑单独检查哈希中的每个键并在找到匹配项时停止,但只是想知道是否有更有效的方法,特别是对于较大的表)
【问题讨论】:
标签:
ruby-on-rails
ruby
ruby-on-rails-4
rails-activerecord
【解决方案1】:
您可以进行自定义搜索。
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))
【解决方案2】:
让我们像这样进行自定义搜索:
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]
这意味着您不关心一个或多个字段是否为零