2016-12-13 14 views
0

У меня есть база данных с размером enginze для автомобиля Поэтому пользователь может написать что-то вроде 2.5 (например, в литрах) или 2500 (куб. См) Позже у меня есть сортировка, и она должна использовать 999 -9999 для сравненияРельсы конвертировать целое значение перед сохранением

Я подошел к функции ниже, но мне бы хотелось, чтобы она была более гибкой. Более того, 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

Если вы хотите, чтобы пользователь мог использовать разные единицы ввода, я бы сделал его явным для пользователя, разрешив им выбрать устройство.

Start путем создания виртуального атрибута

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