我正在尝试使用attr_accessor获取通常正常工作的日期,除非我尝试将其与select_date辅助方法一起使用。
查看帮助器方法背后的代码我猜它会查找具有日期类型的表列。在这种情况下,由于没有表,它没有正确处理它,我得到:
"search"=>{"number_of_days"=>"3",
"searchable_id"=>"6933",
"startdate(1i)"=>"2011",
"startdate(2i)"=>"2",
"startdate(3i)"=>"11"}}
有解决方法吗?或者我是否需要在控制器中创建某种过滤器?我更喜欢在模型级别上做,但我不知道如何处理这种情况?每个人的attr_accessor似乎有点过分杀人。其他人有一个优雅的解决方案吗?
答案 0 :(得分:3)
attr_accessor字段。你是如何更新模型的?
此外,您可以将startdate参数转换为日期对象,如下所示:
@start_date = Date.civil(params[:search][:"startdate(1i)"].to_i,params[:search][:"startdate(2i)"].to_i,params[:search][:"startdate(3i)"].to_i)
答案 1 :(得分:1)
迟到,但万一其他人绊倒了,现代导轨的答案在于您模型中的 include ActiveRecord::AttributeAssignment
。
This answer 为我做的。
答案 2 :(得分:0)
select_date
用于构建与模型字段无关的下拉列表(您可以在另一侧获取它们,然后使用它们执行您想要的操作)。我假设你的意思是date_select
,这会影响模型吗?
在任何情况下,据我所知,长话短说,没有好的和漂亮的方式让这个工作。这不是因为帮助程序的工作方式,而是因为活动记录处理这些属性的方式分为多个参数。
如果你感兴趣,可以更详细一点,这就是因为当Active Record处理你传入的params时,它会通过execute_callstack_for_multiparameter_attributes
来解释已被拆分为“date(1i)”样式的键,并将它们粘贴到它们应该是的适用类(日期或时间对象)中。它是否应该创建日期或时间的方法是通过检查属性的类型(see here),但由于你的'startdate'属性没有绑定到特定类型,它不会不会被视为数据库中的日期或日期时间列。
我想我会像@ Phyo-Wai-Win一样处理它,但是使用select_date
在'search'命名空间之外设置一个不同的参数,然后你可以根据需要将其传递给模型控制器。这样,它就没有多大工作,这意味着你不会弄乱你初始化记录的方式或它预期的属性。
答案 3 :(得分:0)
我在这里有点晚了,但我刚遇到这个问题并且不喜欢最好的答案。我在ActiveRecord源中找到了一个名为 extract_callstack_for_multiparameter_attributes 的方法(这与idlefingers提到的方法不同)
我的模型中有以下方法。我手动调用此方法但您可以覆盖update_attributes
以便在从控制器保存时自动运行它。 params参数实际上是来自控制器的params [:my_model]。
attr_accessor :submit_from, :submit_to
def set_dates(params)
dates = extract_callstack_for_multiparameter_attributes(params)
dates.each_pair do |field, date_array|
send "#{field}=", Date.new(*date_array)
end
end