2010-12-14 8 views
1

私のデータベースの文字列(混乱しているtimeという名前の文字列)に入力されたデータを特定の方法でフォーマットする必要があります。このプロジェクトのレガシーデータの問題のため、古いエントリを失うので、単に列の型を文字列から時間に変更することはできません。データベースに文字列を入力する方法を書式設定する

私は単純に次のような情報フォームに入力し、データベースに提出の形式であることを必要とします:

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

私はform_for以内どのようにしていることだろうが。

私はRails 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がnilの場合、old_timeから時間値を取得し、それを時間オブジェクトに変換しようとします。あなたのような何か与えるだろう

  1. Time.parse(「12:34」):

    は、2つの欠点があり、あなたはそれを唯一の時間と分を与えたので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 
関連する問題