在我看来,我想使用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宝石。
答案 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