2016-12-13 98 views
0

我有一個數據庫與汽車的尺寸大小 因此,用戶可以寫一些像2.5(如升)或2500(cc) 後來我有一個排序,它應該使用999 -9999的值來比較Rails保存前轉換整數值

我想出了下面的函數,但我希望它更靈活。而且,現在2.5導致2000的結果,因爲看起來像Rails在觸發前轉換值before_save

如何進行轉換並檢測輸入中是否有點或逗號?

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

如果您希望用戶能夠使用不同的輸入單位,我會通過讓他們選擇單位來向用戶顯式說明它。

開始通過創建虛擬屬性

class Car 
    attr_accessor :engine_size_unit 
end 

的屬性添加到形式和在控制器列入白名單它

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

則該值在模型中使用轉換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 
+0

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