2017-03-09 71 views
3

在我看來,我想使用Ransack gem在日期列和字符串列中搜索具有相同text_field的值。如何使用Ransack gem在多列中搜索日期和其他值類型?

我已經知道如何只用一個文本字段搜索多個字符串列,但是搜索日期列和字符串列已證明很難。

我試圖在視圖中是這樣的:

<%= 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 

但是,不能正常工作。它會忽略用於搜索的名稱列。它只會帶來它在日期欄中找到的內容。我需要在這兩列中搜索的東西。

有人可以幫助我嗎?

對於分頁我使用Kaminari寶石。

回答

2

這是絕對有可能與Ransack。也許你的日期輸入不能被解析(內部使用Time.zone.parse),或者解析的時間實際上並不匹配任何東西。

我想這對我的應用程序,在這裏我也用洗劫:

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實例包含als o原始查詢輸入中缺少的時間。如果數據庫列不匹配確切 Ransack返回不匹配。 (用純日期列這應該工作,雖然)

如果這確實是原因,您可以使用自定義ransacker

MyModel附加:

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

根據您的數據庫後端,您可能需要使用不同的語法將時間戳記轉換爲日期。 (例如,試用PostgreSQL的date_trunc('day', my_date_column)

更多關於毀滅者的細節:https://github.com/activerecord-hackery/ransack/wiki/using-ransackers