3

データベースに10進数のデータ型である期間フィールドがあります。

私のフォームは小数(たとえば1.5時間)を受け入れますが、 HH:MM(たとえば1時間30分の1:30 )も受け入れられるようにしたいと思います。

before_saveモデルで正規表現がオンになっているHH:MMを検出し、それを10進数に変換して、ユーザーが10進数またはHH:MMのいずれかを入力できるようにしたいと思います。この部分は問題なく良好ですが、私が抱えている問題は、フィールドの値に対して正規表現をテストすることです。

1:30はデータ型として解釈され--- !ruby/class 'BigDecimal'、正規表現に対してテストできません。

それを行う.to_sと1.0に変換されます

10進数で入力したフィールドをリラックスさせ、モデルで正規表現テスト用にその値を文字列に変換するにはどうすればよいですか?

これが私のコードです:

# --- Model ---
before_save :convert_duration

def convert_duration
  if duration =~ /^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
    time_pieces = duration.split(":")
    hours = time_pieces[0].to_i
    minutes = (time_pieces[1].to_f/60.0)

    # Final value ready for database
    self.duration = (hours+minutes).round(1)
  end
end

Ruby 1.9.3; Rails 3.2.8

4

1 に答える 1

3

元の文字列にアクセスする場合は、この属性を使用しduration_before_type_castます。

ドキュメント:http ://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Accessing+attributes+before+they+have+been+typecasted

于 2012-12-28T01:27:12.507 に答える