Activerecord Rails日期\选择并更新\属性

Activerecord Rails日期\选择并更新\属性,activerecord,ruby-on-rails-3.2,Activerecord,Ruby On Rails 3.2,我要把头发扯下来了,所以我肯定错过了一些基本的东西 我有以下表格(简化): Rails logger报告了以下表单结果(简化): 问题是:Rails似乎没有像预期的那样将这三个字段的参数转换为数据库的date和datetime对象。Rails记录器报告的查询为: UPDATE `public_calls` SET `start_date`=NULL, `end_date`=NULL, `submission_deadline`=NULL, `updated_at`='2012-03-20 20:

我要把头发扯下来了,所以我肯定错过了一些基本的东西

我有以下表格(简化):

Rails logger报告了以下表单结果(简化):

问题是:Rails似乎没有像预期的那样将这三个字段的参数转换为数据库的date和datetime对象。Rails记录器报告的查询为:

UPDATE `public_calls` SET `start_date`=NULL, `end_date`=NULL, `submission_deadline`=NULL, `updated_at`='2012-03-20 20:47:15' WHERE...
知道是什么吗

顺便说一句,Rails 3.2.0/Ruby 1.9.3。公共调用模型上的my属性均不受保护

谢谢

编辑

还尝试使用带有更新属性的:无保护选项!但这也不行

编辑#2

我已尝试调试ActiveRecord的AttributeAssignment模块中发生的情况,如下所示:

def assign_multiparameter_attributes(pairs)
  Rails.logger.info('ASSIGN_MULTIPARAMETER_ATTRIBUTES: '+pairs.inspect)
  execute_callstack_for_multiparameter_attributes(
    extract_callstack_for_multiparameter_attributes(pairs)
  )
end

def execute_callstack_for_multiparameter_attributes(callstack)
  errors = []
  Rails.logger.info('EXECUTE_CALLSTACK_FOR_MULTIPARAMETER_ATTRIBUTES: '+callstack.inspect)
  callstack.each do |name, values_with_empty_parameters|
    begin
      send(name + "=", read_value_from_parameter(name, values_with_empty_parameters))
    rescue => ex
      errors << AttributeAssignmentError.new("error on assignment #{values_with_empty_parameters.values.inspect} to #{name}", ex, name)
    end
  end
  unless errors.empty?
    raise MultiparameterAssignmentErrors.new(errors), "#{errors.size} error(s) on assignment of multiparameter attributes"
  end
end

def extract_callstack_for_multiparameter_attributes(pairs)
  Rails.logger.info('EXTRACT_CALLSTACK_FOR_MULTIPARAMETER_ATTRIBUTES: '+pairs.inspect)
  attributes = { }
  pairs.each do |pair|
    multiparameter_name, value = pair
    attribute_name = multiparameter_name.split("(").first
    attributes[attribute_name] = {} unless attributes.include?(attribute_name)
    parameter_value = value.empty? ? nil : type_cast_attribute_value(multiparameter_name, value)
    attributes[attribute_name][find_parameter_position(multiparameter_name)] ||= parameter_value
  end
  Rails.logger.info('EXTRACT_CALLSTACK_FOR_MULTIPARAMETER_ATTRIBUTES: '+attributes.inspect)
  attributes
end

你知道为什么没有调用execute\u callstack\u for\u multiparameter\u attributes方法吗?

升级你的rails版本-我也遇到了同样的问题,从V3.2.0升级到V3.2.8为我解决了这个问题

升级rails版本-我也遇到了同样的问题,从V3.2.0升级到V3.2.8为我解决了这个问题

我也有这个问题。你能弄明白吗?我也有这个问题。你能弄明白吗?rails变更日志中有关于这些方法的内容吗?rails变更日志中有关于这些方法的内容吗?
Parameters:
  {"public_call"=>
    {"start_date(1i)"=>"2012",
     "start_date(2i)"=>"9",
     "start_date(3i)"=>"30",
     "end_date(1i)"=>"2012",
     "end_date(2i)"=>"10",
     "end_date(3i)"=>"3",
     "submission_deadline(1i)"=>"2012",
     "submission_deadline(2i)"=>"4",
     "submission_deadline(3i)"=>"27",
     "submission_deadline(4i)"=>"23",
     "submission_deadline(5i)"=>"59"}
  }
UPDATE `public_calls` SET `start_date`=NULL, `end_date`=NULL, `submission_deadline`=NULL, `updated_at`='2012-03-20 20:47:15' WHERE...
def assign_multiparameter_attributes(pairs)
  Rails.logger.info('ASSIGN_MULTIPARAMETER_ATTRIBUTES: '+pairs.inspect)
  execute_callstack_for_multiparameter_attributes(
    extract_callstack_for_multiparameter_attributes(pairs)
  )
end

def execute_callstack_for_multiparameter_attributes(callstack)
  errors = []
  Rails.logger.info('EXECUTE_CALLSTACK_FOR_MULTIPARAMETER_ATTRIBUTES: '+callstack.inspect)
  callstack.each do |name, values_with_empty_parameters|
    begin
      send(name + "=", read_value_from_parameter(name, values_with_empty_parameters))
    rescue => ex
      errors << AttributeAssignmentError.new("error on assignment #{values_with_empty_parameters.values.inspect} to #{name}", ex, name)
    end
  end
  unless errors.empty?
    raise MultiparameterAssignmentErrors.new(errors), "#{errors.size} error(s) on assignment of multiparameter attributes"
  end
end

def extract_callstack_for_multiparameter_attributes(pairs)
  Rails.logger.info('EXTRACT_CALLSTACK_FOR_MULTIPARAMETER_ATTRIBUTES: '+pairs.inspect)
  attributes = { }
  pairs.each do |pair|
    multiparameter_name, value = pair
    attribute_name = multiparameter_name.split("(").first
    attributes[attribute_name] = {} unless attributes.include?(attribute_name)
    parameter_value = value.empty? ? nil : type_cast_attribute_value(multiparameter_name, value)
    attributes[attribute_name][find_parameter_position(multiparameter_name)] ||= parameter_value
  end
  Rails.logger.info('EXTRACT_CALLSTACK_FOR_MULTIPARAMETER_ATTRIBUTES: '+attributes.inspect)
  attributes
end
ASSIGN_MULTIPARAMETER_ATTRIBUTES: [["start_date(1i)", "2012"], ["start_date(2i)", "9"], ["start_date(3i)", "30"], ["end_date(1i)", "2012"], ["end_date(2i)", "10"], ["end_date(3i)", "3"], ["submission_deadline(1i)", "2012"], ["submission_deadline(2i)", "4"], ["submission_deadline(3i)", "27"], ["submission_deadline(4i)", "23"], ["submission_deadline(5i)", "59"]]
EXTRACT_CALLSTACK_FOR_MULTIPARAMETER_ATTRIBUTES: [["start_date(1i)", "2012"], ["start_date(2i)", "9"], ["start_date(3i)", "30"], ["end_date(1i)", "2012"], ["end_date(2i)", "10"], ["end_date(3i)", "3"], ["submission_deadline(1i)", "2012"], ["submission_deadline(2i)", "4"], ["submission_deadline(3i)", "27"], ["submission_deadline(4i)", "23"], ["submission_deadline(5i)", "59"]]
EXTRACT_CALLSTACK_FOR_MULTIPARAMETER_ATTRIBUTES: {"start_date"=>{1=>2012, 2=>9, 3=>30}, "end_date"=>{1=>2012, 2=>10, 3=>3}, "submission_deadline"=>{1=>2012, 2=>4, 3=>27, 4=>23, 5=>59}}