Rails4:可以进行可选的ActiveRecord搜索吗?

时间:2016-02-03 13:24:24

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord

假设我的数据库中有一条记录,如

+----+-----------+----------+
| id | firstname | lastname |
+----+-----------+----------+
|  1 | 'Bill'    | nil      |
+----+-----------+----------+

(注意姓氏为零)

我是否可以使用以下哈希结构作为搜索参数检索上述记录:

vals = {firstname: "Bill", lastname: "test"}
Table.where(vals)

(即:找到最接近的匹配,忽略表中的nil列值)

(我考虑单独检查哈希中的每个键,并在找到匹配时停止,但只是想知道是否有更有效的方法,特别是对于更大的表)

2 个答案:

答案 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]

这意味着你不关心一个或多个字段是否为