RansackでDateTime型の検索してみるヘ(^o^)ノ
Ransackはとっても便利ですよねー
さらっとしか使えてないので、ちょっと調べてみました
eq
は完全一致、cont
は中間一致
などなどとっても簡単に検索機能を実装できます
そこでDateTime型のフィールドを検索したい場合、時分秒までは検索しないですよね?
やりたいことはDateTime型のフィールドをDate型で検索したいので
# in the model : ransacker :created_at do Arel::Nodes::SqlLiteral.new "date(items.created_at)" end
SQLを確認してみる
SELECT "projects".* FROM "projects" WHERE ((date(projects.created_at) >= '2014-11-03' AND date(projects.created_at) <= '2014-11-03'))
これでyyyy-mm-ddの日付型で検索できますねー
文字列 yyyy/mm/ddで検索したい場合はこう
# in the model ransacker :created_at do Arel::Nodes::SqlLiteral.new "strftime('%Y/%m/%d', projects.created_at)" end
SQLを確認してみる
SELECT "projects".* FROM "projects" WHERE ((strftime('%Y/%m/%d', projects.created_at) >= '2014/11/03' AND strftime('%Y/%m/%d', projects.created_at) <= '2014/11/03'))
できたーヘ(^o^)ノ
入力された文字列を日付型として扱いたい場合は、以下の設定ファイルを追加してあげよう
Ransack.configure do |config| config.add_predicate 'date_lteq', arel_predicate: 'lteq', formatter: proc { |v| v.to_date }, validator: proc { |v| v.present? }, type: :string end
これでcreated_at_date_lteq
とすれば、yyyy/mm/ddと入力されても日付型に変化してくれます
注意) このコードはSQLite用ですm(__)m
Arel::Nodes::SqlLiteral.new
=> Arel.sql
でいけると思います
もちろんDate関数も変わってきますのでご注意を
と色々やってきたとこで、このQiita記事をみると... 検索用のgem「ransack」を使ってみる
日付型のFrom - Toはこれで良いみたいですなー
Ransack.configure do |config| config.add_predicate 'date_lteq', arel_predicate: 'lteq', formatter: proc { |v| v.end_of_day }, # ここでend_of_dayメソッドコールしてる validator: proc { |v| v.present? } end
なるほど...そやね( ̄▽ ̄;)
すごい遠回り感がハンパないけど、いいやw
Happy Hacking٩( ‘ω’ )و