2010-12-14 4 views
1

내 데이터베이스의 문자열 열 (혼란스럽게도 time)에 입력 된 데이터의 형식을 특정 방식으로 지정하고 싶습니다. 이 프로젝트의 기존 데이터 문제로 인해 열 입력을 잃어 버리기 때문에 단순히 열 유형을 변경할 수는 없습니다.문자열을 내 데이터베이스에 입력하는 방법의 서식 지정

는 단순히 정보의 형식은 양식에 입력 한 후 다음과 같이 데이터베이스가에 제출해야 할 :

00:00 where a 0 can by any integer 0-9.

어떻게 내가 그 안에 form_for 할 것입니다.

레일 2.3.8을 사용하고 있습니다.

+0

당신은 필드 유형을 변경할 수 있지만 여러 조치를 취하고 있습니다. 가치가 있는지 여부가 다음 질문입니다. –

+0

네 ... 전 필드 유형을 변경하고 싶지 않습니다. 들어가는 데이터 형식을 찾는 방법을 찾으십시오. – bgadoci

+0

필드 유형을 변경하려면 ... 기존 데이터를 매핑 할 수 있습니까? – bgadoci

답변

0

정규식은 /\d\d:\d\d/이지만 Ruby에서 정규 표현식을 사용하는 방법을 모르겠습니다.

+0

사실, 그건 정규식이 아닙니다. 아마도 당신은'\ d'을 의미할까요? –

+0

Eek! 그래, 그게 내 뜻이야. –

0

귀하의 정규식은 다음과 같습니다

/[0-9]{2}:[0-9]{2}/ 

또는 여기

/\d\d:\d\d/ 

일부 시험이다 : 나는 당신의 지정된 솔루션으로 작업 한이 시점까지

'00:00'[/[0-9]{2}:[0-9]{2}/] # => "00:00" 
'12:00'[/\d\d:\d\d/]   # => "12:00" 
'11:59'[/[0-9]{2}:[0-9]{2}/] # => "11:59" 
'23:59'[/\d\d:\d\d/]   # => "23:59" 

':'[/[0-9]{2}:[0-9]{2}/] # => nil 
':0'[/[0-9]{2}:[0-9]{2}/] # => nil 
'0:0'[/[0-9]{2}:[0-9]{2}/] # => nil 
'000:0'[/[0-9]{2}:[0-9]{2}/] # => nil 
'0:000'[/[0-9]{2}:[0-9]{2}/] # => nil 

하지만, 여기에 고장이 발생하는 곳 :

# BUG? 
'1:00'[/[0-9]{2}:[0-9]{2}/] # => nil 

# Fix? 
'1:00'[/[0-9]{1,2}:[0-9]{2}/] # => "1:00" 

# *** BUG *** 
'99:99'[/[0-9]{2}:[0-9]{2}/] # => "99:99" 

'99 : 99 '는 허용됩니다.

시간 값과 같은 것을 처리 할 때 정규식을 사용하여 범위를 확인하려고 시도하는 것이 실제로 가능하지 않습니다. 그것은 할 수 있지만 정규식은 추악 해집니다.

다음은 솔루션의 시작입니다. validates_timeliness 또는 같은

timeval = '00:00'[/[0-9]{2}:[0-9]{2}/] 
(timeval.split(':').map(&:to_i) <=> [11,59]) <= 0 # => true 

timeval = '1:00'[/[0-9]{1,2}:[0-9]{2}/] 
(timeval.split(':').map(&:to_i) <=> [11,59]) <= 0 # => true 

timeval = '1:00'[/[0-9]{1,2}:[0-9]{2}/] 
(timeval.split(':').map(&:to_i) <=> [11,59]) <= 0 # => true 

timeval = '0:99'[/[0-9]{1,2}:[0-9]{2}/] 
(timeval.split(':').map(&:to_i) <=> [11,59]) <= 0 # => true 

timeval = '99:99'[/[0-9]{1,2}:[0-9]{2}/] 
(timeval.split(':').map(&:to_i) <=> [11,59]) <= 0 # => false 

다른 방법으로, 당신은 몇 가지 <select> popups for the values을 사용하여 조사 할 수 있습니다, 또는 시간 입력을 위해 디자인 된 jQuery 플러그인, 또는 뭔가 : 적절한 범위의 테스트를 마무리하는 독자들에게 연습 문제로 남겨 validates_date_time. 나는 또한 time_select with 12 hour time and Time Zone in Ruby on Rails을 발견했다. search Stack Overflow도 가능합니다.

+0

자, 그렇다면 어떻게 구현 될까요? Run 모델에 추가가 있습니까? 어디로 갈지 (모델,보기)에 대한 구체적인 내용을 알려 주실 수 있습니까? 나는 레일에 약 1.5 년이 걸렸고, 그래서 reg 표현과 테스트는 내가 아직 익혔던 것이 아니다. – bgadoci

1

그 주변의 일이 도움이 될 수 있습니다 :

먼저 마이그레이션하고 생성 :

rename_column :the_models, :time, :old_time 
add_column :the_models, :time, :time 

을 그래서 지금을, 필드있을 것이다 모델은 원래 시간 데이터, 새로운 time 필드를 포함 old_time라고 올바른 필드 유형을가집니다.

결과적으로 기존 양식은 모든 시간 데이터를 잃어버린 것 같지만 적어도 결과는 the_model.time입니다. 일부 주변

실제 작업 :

class TheModel < ActiveRecord::Base 
    def time 
    read_attribute(:time) || Time.parse(read_attribute(:old_time)) 
    end 
end 

그래서 지금 시간 값이 제출 한 time에 저장됩니다.

time이 0 일 경우 old_time에서 시간 값을 가져 와서 시간 개체로 변환하려고 시도합니다. 당신 같은 줄 것

  1. Time.parse ("12시 34분") :

    는 두 가지 단점이 있습니다 당신이 그것을 단지 시간과 분을 준 때문에 2010-12-14 12:34:00 +0800 를, 다른 필드는 신뢰할 수 없습니다.

  2. 데이터베이스에 거의 사용되지 않는 필드 old_time이 있습니다. 따라서 모든 old_time 값이 time 필드로 변환되었다는 확신을 갖고 나면 해당 필드를 완전히 제거 할 수 있습니다.

하나 더 참고 :

당신은 아마 text_field을 사용 :time 필드, 기존 양식을 변환해야합니다. text_field가 2010-12-14 12:34:00 +0800과 같이 표시 될 수 있습니다.

당신이 정말로 여전히 text_field을 사용하려면

, 당신은 할 수 :

def time 
    t = read_attribute(:time) 
    t.nil? ? read_attribute(:old_time) : t.strftime("%H:%M") 
end 

def time=(val) 
    write_attribute(:time, Time.parse(val)) 
end