4

我正在尝试使用 time_select 将时间输入到模型中,然后执行一些计算。

time_select 帮助器准备返回的参数,以便可以在对 Active Record 对象的多参数分配中使用它。

类似于以下内容

  Parameters: {"commit"=>"Calculate", "authenticity_token"=>"eQ/wixLHfrboPd/Ol5IkhQ4lENpt9vc4j0PcIw0Iy/M=", "calculator"=>{"time(2i)"=>"6", "time(3i)"=>"10", "time(4i)"=>"17", "time(5i)"=>"15", "time(1i)"=>"2009"}}

我的问题是,在非活动记录模型中使用这种格式的最佳方法是什么。也在旁注中。(5i)、(4i) 等是什么意思?(除了区分不同时间值的明显原因,基本上就是为什么这样命名)

谢谢

4

2 回答 2

4

您可以在非活动记录模型中创建一个方法,如下所示

# This will return a Time object from provided hash
def parse_calculator_time(hash)
  Time.parse("#{hash['time1i']}-#{hash['time2i']}-#{hash['time3i']} #{hash['time4i']}:#{hash['time5i']}")
end

然后,您可以从控制器操作中调用该方法,如下所示

time_object = YourModel.parse_calculator_time(params[:calculator])

它可能不是最好的解决方案,但使用起来很简单。

干杯:)

于 2009-06-11T03:32:29.487 回答
2

数字后面的字母代表您希望将其转换为的类型。在这种情况下,integer。也可以是fforfloatsfor string

我自己就是这样做的,我能找到的最简单的方法是将 Rails 代码复制/粘贴到我的基本模块(或抽象对象)中。

我逐字复制了以下函数ActiveRecord::Base

  • assign_multiparameter_attributes(pairs)
  • extract_callstack_for_multiparameter_attributes(pairs)
  • type_cast_attribute_value(multiparameter_name, value)
  • find_parameter_position(multiparameter_name)

我还有以下调用/使用它们的方法:

def setup_parameters(params = {})
  new_params = {}
  multi_parameter_attributes = []

  params.each do |k,v|
    if k.to_s.include?("(")
      multi_parameter_attributes << [ k.to_s, v ]
    else
      new_params[k.to_s] = v
    end
  end

  new_params.merge(assign_multiparameter_attributes(multi_parameter_attributes))
end

# Very simplified version of the ActiveRecord::Base method that handles only dates/times
def execute_callstack_for_multiparameter_attributes(callstack)
  attributes = {}

  callstack.each do |name, values|

    if values.empty?
      send(name + '=', nil)
    else
      value = case values.size
        when 2 then t = Time.new; Time.local(t.year, t.month, t.day, values[0], values[min], 0, 0)
        when 5 then t = Time.time_with_datetime_fallback(:local, *values)
        when 3 then Date.new(*values)
        else nil
      end

      attributes[name.to_s] = value
    end

  end

  attributes
end

如果您找到更好的解决方案,请告诉我:-)

于 2009-06-11T00:04:38.767 回答