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

PostgreSQLMySQLは、

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٩( ‘ω’ )و

参考サイト

検索用のgem「ransack」を使ってみる

Using Ransackers