简体   繁体   English

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

[英]Ruby on Rails Ransack Datetime to date search

Like carvil I have in my model a datetime for created_at although I wanted the "equals" predicate to compare the created_at and a date (like '2012-09-26'). 就像carvil我在我的模型中有created_at的日期时间虽然我想要“equals”谓词来比较created_at和日期(比如'2012-09-26')。

So I added in my model (in order to add casted attributes and take off the old created_at/update_at/deleted_at : 所以我在我的模型中添加了(为了添加已转换的属性并取消旧的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

But when I confirm the query (created_at equals to '2012-03-24') I have this error: 但是当我确认查询(created_at等于'2012-03-24')时,我有这个错误:

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

Surprisingly, it works with "greater than" and "less than". 令人惊讶的是,它适用于“大于”和“小于”。 Only "equals" occurs this error. 此错误仅发生“等于”。

I made all of this for all my models and 60% works (the remain 40% occurs this error). 我为我的所有模型制作了所有这些并且60%的作品(剩下的40%发生了这个错误)。

In the console : 在控制台中:

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

Thanks for your help 谢谢你的帮助

EDIT : 编辑:

I have a default_scope which makes : Item(:deleted_at false) 我有一个default_scope,它使:Item(:deleted_at false)

But I don't know why it occurs the error 但我不知道为什么会出现错误

Please changes Arel::Nodes::SqlLiteral.new('date(column_name)') with Arel.sql('date(column_name)') . 请使用Arel::Nodes::SqlLiteral.new('date(column_name)')更改Arel::Nodes::SqlLiteral.new('date(column_name)') Arel.sql('date(column_name)')

Your syntax will be :: 你的语法将是::

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

I hove this would be helpful. 我希望这会有所帮助。

I had some problems with this, and came with this: 我遇到了一些问题,并附带了这个问题:

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

Refer to second example of Ransack wiki , 请参阅Ransack wiki的第二个示例

in the model: 在模型中:

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

in the view: 在视图中:

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

config/initializers/ransack.rb 配置/初始化/ 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

The new predicate 'date_equals' is added for the date equal search. 为日期相等搜索添加新谓词'date_equals'。 The ransacker declared with type: :date and get the date from datetime column with Arel 使用类型:: date声明的ransacker并使用Arel从datetime列获取日期

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM