gpt4 book ai didi

ruby-on-rails - Ruby on Rails Ransack 日期时间到日期搜索

转载 作者:数据小太阳 更新时间:2023-10-29 07:18:39 27 4
gpt4 key购买 nike

像 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)

但是不知道为什么会报错

最佳答案

引用second example of Ransack wiki ,

在模型中:

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

在 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.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: :date 并使用 Arel 从 datetime 列获取日期

关于ruby-on-rails - Ruby on Rails Ransack 日期时间到日期搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12605518/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com