2016-12-13 11 views
0

私は車のエンジンサイズが であるため、ユーザーは2.5(リットルのような)または2500(cc)のようなものを書くことができます 後で並べ替えがあり、 -9999比較する値保存する前に整数値を変換するレール

私は以下の機能を思いついたが、もっと柔軟にしたいと思う。さらに、before2saveをトリガする前に値を変換するRailsのように見えるため、2.5の結果が出る

入力にポイントまたはカンマがある場合、変換権を作って検出するにはどうすればよいですか?

before_save :covert_engine 

private 
def covert_engine 
    if self.car_engine_size.present? 
     if Math.log10(self.car_engine_size).to_i + 1 < 4 
      self.car_engine_size = self.car_engine_size * 1000 
     end 
    end 
end 

P.S. self.car_engine_sizeはデータベース内の整数です

答えて

0

ユーザが異なる入力単位を使用できるようにするには、ユニットを選択させることでユーザに明示的に指定します。その後the value before the typecast

class Car 
    before_save :covert_engine, 
    if: -> { car_engine_size.present? && engine_size_unit == 'l' } 

    def covert_engine 
    converted = car_engine_size_before_type_cast * 1000 
    self[:car_engine_size] = converted.to_i 
    end 
end 
を使用してモデルに値を変換

class Car 
    attr_accessor :engine_size_unit 
end 

フォームに属性を追加し、コントローラに

<%= f.number_field :engine_size %> 
<%= f.select :engine_size_unit, ['cc', 'l']) %> 

それをホワイトリストに登録仮想属性を作成することによって

スタート

+0

http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/BeforeTypeCast.html – max

関連する問題