【问题标题】:undefined method beginning_of_day for string with ransacker custom filter带有 ransacker 自定义过滤器的字符串的未定义方法 begin_of_day
【发布时间】:2018-05-24 06:29:43
【问题描述】:

我收到下面提到的错误。知道如何解决吗?

undefined method `beginning_of_day' for "2018-01-01":String
/lib/ransack_ext.rb
config.add_predicate old, arel_predicate: current
end
config.add_predicate 'gteq_datetime',
arel_predicate: 'gteq',
formatter: ->(v) { v.beginning_of_day }

代码:

Projects.rb (ActiveAdmin)

filter :project_event_date, label: 'By Project Event Date', as: :date_range

Project.rb(模型)

 has_many :project_events, dependent: :destroy

 ransacker :project_event_date do
  "project_events.event_date"
 end

【问题讨论】:

  • 是的,停止在String 上拨打beginning_of_day。这是行不通的。
  • 您的event_date 列类型是什么?将其更改为日期
  • @seethrough 日期类型
  • 'date(project_events.event_date)'代替"project_events.event_date"
  • @seethrough 没用

标签: ruby-on-rails ruby activeadmin ransack


【解决方案1】:

根据docsbeginning_of_day()

将日期转换为时间(或必要时的日期时间),时间部分设置为一天的开始 (0:00)

String 不是Date。因此,将您的 String 转换为 Date 就可以了。

【讨论】:

  • 我该怎么做?
  • 也许你会发现this resource 很有帮助。特别是第一项。
  • @jvillian 聪明评论,哈哈
  • @jvillian to_date 可以将其转换为日期。但是我应该在哪里调用这个 to_date 函数?
  • 在 ? ransacker :project_event_date do "project_events.event_date" end
【解决方案2】:

首先将字符串转换为日期,然后像这样应用 begin_of_day 方法:-

Date.parse("2018-01-01").beginning_of_day

【讨论】:

  • 他应该在哪里应用这个?
【解决方案3】:

这对你有帮助

ruby ransacker :project_event_date, type: :date do Arel.sql("project_events.event_date") end

ransacker 块结果应该使用 Arel 构建,就像在 Using Ransacker Guide 上显示的那样

active_admin 具有用于谓词的自定义格式化程序,例如
formatter: proc { |v| v.beginning_of_day }
所以你需要将传递的值转换为日期

最好的方法是将typeformatter 提供给ransacker

【讨论】:

    【解决方案4】:

    在数据源中将字段从日期时间转换为日期解决了我的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 2012-04-24
      • 2021-06-21
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      相关资源
      最近更新 更多