Rails之间使用ransack

时间:2014-12-24 10:01:05

标签: ruby-on-rails ransack

我希望在Date.today.beginning_of_day..Date.today.end_of_day

之间搜索created_at

喜欢

Order.search({created_at_between: Date.today.beginning_of_day..Date.today.end_of_day }).result

但不起作用

如何在日期之间搜索created_at

3 个答案:

答案 0 :(得分:2)

配置/初始化/ ransack.rb

Ransack.configure do |config|
  config.add_predicate 'between',
    arel_predicate: 'between',
    formatter: proc { |v|
      parts = v.split(',')
      OpenStruct.new(begin: parts[0], end: parts[1])
    },
    validator: proc { |v| v.present? },
    type: :string
end

然后created_at_between '2014-01-01,2014-01-02'有效!

答案 1 :(得分:1)

这是解决方案,

params[:q] = {:created_at_gt => Date.current.beginning_of_day, :created_at_lt => Date.current.end_of_day}

Order.search(params[:q]).result

答案 2 :(得分:0)

我同意Frank接受的答案,除了我使用的arel版本没有定义'之间'。因此,如果您使用的是旧版本,请参阅下面的快速而肮脏的解决方案。

在我看来,我有一个搜索搜索字段,如

= f.text_field :request_date_between, class: 'daterange'

这将向控制器发送日期,如

  

'2015-10-01至2015-10-31'

然后在我的肮脏的ransack.rb初始化器中,我有;

Ransack.configure do |config|
  config.add_predicate 'between',
                       arel_predicate: 'between',
                       formatter: proc { |v| v.split(' to ') },
                       type: :string
end

module Arel
  module Predications
    def between other
      gteq(other[0]).and(lt(other[1]))
    end
  end
end