Ruby on Rails Ransack Datetime 到日期搜索

Posted

技术标签:

【中文标题】Ruby on Rails Ransack Datetime 到日期搜索【英文标题】:Ruby on Rails Ransack Datetime to date search 【发布时间】:2012-09-18 07:15:50 【问题描述】:

像 carvil 一样,我的模型中有 created_at 的日期时间,尽管我希望“等于”谓词来比较 created_at 和日期(如“2012-09-26”)。

所以我在我的模型中添加了(为了添加铸造属性并取下旧的 created_at/update_at/deleted_at :

ransacker :created_at do
    Arel::Nodes::SqlLiteral.new("date(items.created_at)")
end

ransacker :updated_at do
    Arel::Nodes::SqlLiteral.new("date(items.updated_at)")
end

ransacker :deleted_at do
    Arel::Nodes::SqlLiteral.new("date(items.deleted_at)")
end

# Hide some attributes for advanced search
UNRANSACKABLE_ATTRIBUTES = ["created_at", "updated_at", "deleted_at"]

def self.ransackable_attributes auth_object = nil
    (column_names - UNRANSACKABLE_ATTRIBUTES) + _ransackers.keys
end

但是当我确认查询时(created_at 等于 '2012-03-24')我有这个错误:

NoMethodError (undefined method `name' for "date(items.created_at)":Arel::Nodes::SqlLiteral):

令人惊讶的是,它适用于“大于”和“小于”。只有“等于”才会出现这个错误。

我为我的所有模型都做了这一切,并且 60% 的作品(剩下的 40% 发生了这个错误)。

在控制台中:

irb(main):232:0> Item.search(:created_at_eq => Date.today.to_s).result
(Object doesn't support #inspect)

感谢您的帮助

编辑:

我有一个 default_scope,它可以: 项目(:deleted_at false)

但我不知道为什么会出现错误

【问题讨论】:

看起来这个问题还没有解决:github.com/activerecord-hackery/ransack/issues/34。你有没有弄清楚你的问题? 【参考方案1】:

参考second example of Ransack wiki,

在模型中:

ransacker :created_at , type: :date do
  Arel.sql('date(created_at)')
end

在视图中:

<%= f.search_field(
  :created_at_date_equals, placeholder: t(:date_format)
  ) %>
...
<%= sort_link(@search, :created_at, default_order: :desc) %>

config/initializers/ransack.rb

Ransack.configure do |config|
  config.add_predicate 'date_equals',
  arel_predicate: 'eq',
  formatter: proc  |v| v.to_date 
  validator: proc  |v| v.present? ,
  type: :string
end

为日期相等搜索添加了新谓词“date_equals”。用 type: 声明的 ransacker 并使用 Arel 从 datetime 列中获取日期

【讨论】:

【参考方案2】:

我对此有一些问题,并提出了这个:

ransacker :created_at, type: :date do
  Arel.sql('date(created_at)')
end

【讨论】:

【参考方案3】:

请将Arel::Nodes::SqlLiteral.new('date(column_name)') 更改为Arel.sql('date(column_name)')

你的语法是::

ransacker :created_at do
    Arel.sql("date(items.created_at)")
end

ransacker :updated_at do
    Arel.sql("date(items.updated_at)")
end

ransacker :deleted_at do
    Arel.sql("date(items.deleted_at)")
end

我希望这会有所帮助。

【讨论】:

以上是关于Ruby on Rails Ransack Datetime 到日期搜索的主要内容,如果未能解决你的问题,请参考以下文章

Ransack,搜索多列,一个字段,rails 3

Rails 3.1 Ransack HABTM

在 Ransack 上为 Rails 设置默认搜索参数

rails gem ransack 之模糊搜索

Rails,Ransack:如何在 HABTM 关系中搜索“所有”匹配项而不是“任何”匹配项

如何在 Rails 3 中将范围与 Ransack 一起使用?