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

时间:2012-09-26 15:43:55

标签: ruby-on-rails ruby search 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

但是当我确认查询(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,它可以: Item(:deleted_at false)

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

3 个答案:

答案 0 :(得分: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

我希望这会有所帮助。

答案 1 :(得分:1)

我遇到了一些问题,随之而来:

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

答案 2 :(得分:0)

请参阅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”。使用类型::date声明的抢劫犯,并使用Arel从datetime列获取日期