2017-03-09 9 views
3

私の見解では、Ransackの宝石を使って同じtext_fieldの日付列と文字列の値を検索したいと考えています。Ransack gemを使用して複数の列の日付と別の値の型を検索するにはどうすればよいですか?

テキストフィールドを1つだけ使用して複数の文字列を検索する方法はすでにわかっていますが、日付列と文字列を検索することは難しいことが証明されています。コントローラで

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

しかし、それは、動作しません

私はビューでこのような何かを試してみました。検索のための名前列は無視されます。それは、日付の列にあるものだけを返します。そして、2つの列で検索するために必要なものが必要です。

誰かが私を助けることができますか?

ページネーション用に私はカミナリの宝石を使用します。

答えて

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インスタンスには、 o元のクエリー入力から欠落している時間。データベース列が同じ時刻に一致しない場合正確に Ransackは一致を返しません。あなたによって

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

MyModelアドオンで

:それは実際には原因である場合

を(純粋な日付列では、これはしかし、動作するはずです)、カスタムransackerを使用することができますタイムスタンプを日付にキャストするために別の構文が必要になることがあります。 https://github.com/activerecord-hackery/ransack/wiki/using-ransackers

:Ransackers上

詳細(例えばPostgreSQLのdate_trunc('day', my_date_column)を試してみてください)

関連する問題