2013-04-11 3 views
0

duration 02:00 또는 19:20 (시 및 분)과 같이 시간 범위를 삽입하려는 데이터베이스 테이블에 열 유형이 time .시간 구성원에 문자열 추가 및 데이터베이스에 저장

=f.select :durationhours, options_for_select((0..23).to_a) 
=f.select :durationminutes, options_for_select((0..59).to_a) 

양식이 form_for 생성하고, 내 데이터베이스의 모든 durationminutes 또는 durationhours 그래서 '이없는 : 사용자는 두 개의 드롭 다운 목록, 시간에 대한 분 하나 하나에 양식을 본다 내 모델에서 validates_acceptance_of를 사용합니다. 폼이 나는 함께 시간과 분을 넣어 데이터베이스로 저장하는 것을 시도하고, 그러나 이것은 (만 롤백이 터미널에서 언급 한) 모든 오류를 표시하지 않고, 실패 제출

attr_accessible :durationhours, :durationminutes #not sure this line is necessary 
validates_acceptance_of :durationhours, :durationminutes 

. 내가 수동으로 시간을 설정할 경우, @record.save 잘 작동 위의 라인없이

@record.duration = params[:record][:durationhours].to_s.rjust(2, "0") + ":" + params[:record][:durationminutes].to_s.rjust(2, "0") 
# but I even tried this, and it doesn't work: 
@record.duration = "13:30" 

: 내가 뭘 원하는 같은 것입니다. 이 저장이 실행 된 후 나는 @record.errors.inspect으로지고있어 오류입니다 :

#<ActiveModel::Errors:0x10ba5be08 @messages=#<OrderedHash {:durationhours=>["must be accepted"], 
:durationminutes=>["must be accepted"]}>, @base=#<Record id: nil, details: "", 
happened: "2013-04-11 02:19:10", duration: "2000-01-01 12:12:00", activity_id: 17, 
created_at: nil, updated_at: nil, price: nil>> 

답변

1

validates_acceptance_of 당신이 여기 사용하려는 유효성 검사를하지 않습니다. 해당 유효성 검사기는 부울 값이 설정되어 있는지 확인합니다.

즉, 문자열을 만드는 대신 기간을 정수로 저장하는 것이 좋습니다.

self.duration = self.durationminutes.to_i.minutes + self.durationseconds.to_i 

이렇게하면 DB의 단일 정수 필드에 저장할 수있는 기간이 초 단위로 표시됩니다.

durationminutes = 10 
durationseconds = 24 
duration = durationminutes.minutes + durationseconds 
=> 624 

624/1.minute => 10 
624 - 10.minutes => 24 
+0

그러나'validates_acceptance_of'가 없으면 form.for가 테이블 열을 기대하는 시간과 분 드롭 다운을 추가 할 수 없었습니다. 어떻게 그렇게 할 것입니까? – networkprofile

+0

'attr_accessor : durationhours, : durationminutes' ('attr_accessible'과 혼동해서는 안됩니다.) 그러면 해당 속성에 대한 클래스의 인스턴스에 getter와 setter가 생성됩니다 –

+0

'attr_accessible' 지시어도 유지해야합니다. 'accessor'는 getters와 setter를 생성하고,'accessible'은 레일스에 대량 할당을 할 수 있다고 알려줍니다. –

1

당신은 내가 내 콘솔에서 1 시간으로 변경 이유를 모르겠어요이

irb> time = '20'.to_i.hours + '05'.to_i.minutes 
=> 72300 seconds 
irb> Time.at time 
=> 1970-01-01 21:05:00 +0100 

처럼 할 수 있지만 수행하여 UTC를 얻을 수 있습니다 :

irb> Time.at(time).utc 
=> 1970-01-01 20:05:00 UTC 
관련 문제