Rails, используя time_select на неактивной модели записи - PullRequest
4 голосов
/ 11 июня 2009

Я пытаюсь использовать 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) и т. Д.? (Кроме очевидной причины различать разные значения времени, в основном, почему он был назван таким образом)

Спасибо

Ответы [ 2 ]

4 голосов
/ 11 июня 2009

Вы можете создать метод в неактивной модели записи следующим образом

# 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])

Возможно, это не лучшее решение, но оно простое в использовании.

Приветствия:)

2 голосов
/ 11 июня 2009

Буква после числа обозначает тип, к которому вы хотите, чтобы он был приведен. В этом случае integer. Это также может быть f для float или s для 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

Если вы найдете лучшее решение, пожалуйста, дайте мне знать: -)

...