2009-06-10 5 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]) 

최상의 솔루션은 아니지만 사용하기 쉽습니다.

건배 :)

+0

정말 감사드립니다. – abhijit

2

편지 감사 (명백한 이유를 제외하고는이 방식으로 지명되었다 기본적 이유는 서로 다른 시간 값을 구분합니다). 이 경우 integer입니다. float의 경우 f이거나 string의 경우 s 일 수도 있습니다.

나는이 작업을 직접 수행했으며, 레일스 코드를 기본 모듈 (또는 추상적 인 객체)에 복사/붙여 넣기하는 것이 가장 쉬운 방법이었다.

나는 나는 또한 전화/다음과 같은 방법을 사용했다 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

레일 3 또는 4에 대한 해결책은 무엇입니까? 레일즈 4에서 시도한 결과 작동하지 않는 것 같습니다. –

+0

@MattHuggins 이것은 정직하게도 Rails 2에 대한 것일 수 있으므로 *** Rails 4에서는 작동하지 않을 가능성이 높습니다. –

+0

Rails 4.0.1에서 여전히 문제가있는 것 같습니다. 공개 된 문제가 있습니다. https://github.com/rails/rails/pull/8189 –