如何使用Ransack gem在多列中搜索日期和其他值类型?

时间:2017-03-09 12:54:26

标签: ruby-on-rails ruby ransack

在我看来,我想使用Ransack gem在日期列和字符串列中搜索相同text_field的值。

我已经知道如何只用一个文本字段搜索多个字符串列,但是搜索日期列和字符串列已经证明很难。

我在视图中尝试过类似的内容:

<%= f.search_field :date_or_name_eq, { :class => "form-control", :placeholder => "Search..." } %>

这在控制器中:

@q = MyModel.ransack(params[:q])
@q.sorts = 'created_at desc' if @q.sorts.empty?
@my_model = @q.result().order(created_at: :desc).page(params[:page]).per(20).distinct

但那,不起作用。它忽略了用于搜索的名称列。它只会带来它在日期列中找到的内容。而且我需要在theese两列中搜索的东西。

有人能帮助我吗?

对于分页,我使用Kaminari宝石。

1 个答案:

答案 0 :(得分:1)

这对于Ransack来说绝对是可能的。也许您的日期输入无法解析(内部使用Time.zone.parse)或解析时间实际上与任何内容都不匹配。

我在我的应用上试过这个,我也使用Ransack:

Ruby代码:

Client.ransack(name_or_updated_at_eq: '1. Januar 2011').result()

生成的SQL:

SELECT "clients".* FROM "clients" WHERE 
    ("clients"."name" = '1. Januar 2011' OR "clients"."updated_at" = '2011-01-01 00:00:00')

(注意Rails解析本地化日期没有问题)

生成的Time实例还包含原始查询输入中缺少的时间。如果数据库列与完全完全相同,则Ransack返回不匹配。 (使用纯日期列,这应该可行)

如果这确实是原因,您可以使用自定义 ransacker

MyModel添加:

ransacker :my_date_column, type: :date do
  Arel.sql('date(my_date_column)')
end

根据您的数据库后端,您可能需要使用不同的语法将时间戳转换为日期。 (例如,为PostgreSQL尝试date_trunc('day', my_date_column)

有关Ransackers的更多详情:https://github.com/activerecord-hackery/ransack/wiki/using-ransackers