【问题标题】:Rails ransack use betweenRails ransack 之间的使用
【发布时间】:2014-12-24 10:01:04
【问题描述】:

我想在 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

【问题讨论】:

    标签: ruby-on-rails ransack


    【解决方案1】:

    config/initializers/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' 工作!

    【讨论】:

      【解决方案2】:

      这里是解决方案,

      params[:q] = {:created_at_gt => Date.current.beginning_of_day, :created_at_lt => Date.current.end_of_day}
      
      Order.search(params[:q]).result
      

      【讨论】:

        【解决方案3】:

        我同意 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-10
          • 2012-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多