2009-06-10 2 views
4

Я пытаюсь использовать time_select для ввода времени в модель, которая затем выполнит некоторые вычисления.Рельсы, используя time_select в модели с неактивной записью

помощник time_select подготавливает возвращаемые параметры, чтобы он мог использоваться при назначении нескольких параметров объекту активной записи.

Что-то вроде следующего

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

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

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

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

Cheers :)

+0

Большое спасибо за бесценный ответ. – abhijit

2

Буквы после номера обозначает тип, к которому вы хотите его быть брошенными. В этом случае 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 

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

+0

Это решение для Rails 3 или 4? Кажется, он не работает в Rails 4, когда я пытаюсь это сделать. –

+0

@MattHuggins Это, честно, возможно, было для Rails 2, так что *** очень *** вероятно, он не будет работать в Rails 4. –

+0

Похоже, что это все еще проблема с Rails 4.0.1. Для него есть открытая проблема: https://github.com/rails/rails/pull/8189 –

Смежные вопросы