Ruby on rails 日期和问题的属性访问器使用select\u date

Ruby on rails 日期和问题的属性访问器使用select\u date,ruby-on-rails,ruby-on-rails-3,date,attr-accessor,Ruby On Rails,Ruby On Rails 3,Date,Attr Accessor,我尝试对一个日期使用attr\u访问器,该日期通常工作正常,除非我尝试将其与select\u date helper方法一起使用 查看helper方法背后的代码,我猜它会查找日期类型的表列。在这种情况下,由于没有表格,因此无法正确处理,我得到: ActiveRecord::MultiparameterAssignmentErrors 有办法解决这个问题吗?或者我需要在控制器中创建某种类型的前置过滤器吗?我更喜欢在模型层面上做,但我不确定如何处理这种情况?每种类型的attr_访问器似乎都有点过分了

我尝试对一个日期使用attr\u访问器,该日期通常工作正常,除非我尝试将其与select\u date helper方法一起使用

查看helper方法背后的代码,我猜它会查找日期类型的表列。在这种情况下,由于没有表格,因此无法正确处理,我得到:

ActiveRecord::MultiparameterAssignmentErrors
有办法解决这个问题吗?或者我需要在控制器中创建某种类型的前置过滤器吗?我更喜欢在模型层面上做,但我不确定如何处理这种情况?每种类型的attr_访问器似乎都有点过分了。其他人有优雅的解决方案吗?

保存/更新模型时,通常不会保存属性访问器字段。您如何更新模型

此外,还可以将startdate参数转换为如下所示的日期对象:

@start_date = Date.civil(params[:search][:"startdate(1i)"].to_i,params[:search][:"startdate(2i)"].to_i,params[:search][:"startdate(3i)"].to_i)

选择日期
用于构建与模型字段无关的下拉列表(这样您就可以在另一侧拾取它们,并根据需要使用它们)。我想你的意思是
date\u选择
哪个会从模型中运行

无论如何,据我所知,长话短说,没有什么好办法可以让它发挥作用。这不是因为助手的工作方式,而是因为活动记录处理这些被分割成多个参数的属性的方式

如果您感兴趣的话,更详细地说,这不容易实现的原因是,当Active Record处理您传入的参数时,它会对已拆分为“date(1i)”样式的键进行解释,并将它们转换为应该是的适用类(日期或时间对象)。确定是否应该创建日期或时间的方法是根据属性()的类型进行检查,但由于“startdate”属性未绑定到特定类型,因此不会在db中将其视为日期或日期时间列


我想我会像@Phyo Wai Win一样处理它,但是使用
select_date
在“search”名称空间之外设置一个不同的参数,然后在控制器中适当地将其传递到模型中。这样,就不需要做太多的工作,这意味着您没有弄乱初始化记录的方式或它期望的属性。

我来晚了一点,但我只是遇到了这个问题,不喜欢上面的答案。我在ActiveRecord源代码中找到了一个名为“extract\u callstack”的方法,用于多参数属性(这与前面提到的idlefingers方法不同)

在我的模型中有以下方法。我正在手动调用此方法,但您可能会覆盖
update\u 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

虽然来得很晚,但如果有人无意中发现,现代rails的答案在于在您的模型中包含ActiveRecord::AttributeAssignment


为我做的。

我正在使用ActiveModel处理一些没有DB后端的事情。大部分内容都进入了会话,模型处理数据的验证,这就是为什么我也希望这样做。我想这样做:但它在Rails3上对我不起作用。这回答了你的问题吗?
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