Ruby on Rails Ransack日期时间到目前为止的搜索

use*_*764 5 ruby search ruby-on-rails date ransack

就像carvil我在我的模型中有created_at的日期时间虽然我想要"equals"谓词来比较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
Run Code Online (Sandbox Code Playgroud)

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

NoMethodError (undefined method `name' for "date(items.created_at)":Arel::Nodes::SqlLiteral):
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,它适用于"大于"和"小于".此错误仅发生"等于".

我为我的所有模型制作了所有这些并且60%的作品(剩下的40%发生了这个错误).

在控制台中:

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

谢谢你的帮助

编辑:

我有一个default_scope,它使:Item(:deleted_at false)

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

Nit*_*ava 1

请更改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
Run Code Online (Sandbox Code Playgroud)

我希望这会有帮助。