2016-12-13 6 views
0

저는 자동차의 엔진 크기가 데이터베이스에 있습니다 따라서 사용자는 2.5 (리터와 같은) 또는 2500 (CC)의 문자를 쓸 수 있습니다 나중에 정렬이 있으므로 999를 사용해야합니다 -9999 비교할 값레일은 정수 값을 저장하기 전에 변환합니다

나는 아래 함수를 만들었지 만 좀 더 유연 해지고 싶습니다. 게다가, 2000은 이제 레일스가 트리거하기 전에 값을 변환하는 것처럼 보이기 때문에 발생합니다.

입력에 점이나 쉼표가있는 경우 어떻게 변환하고 감지합니까?

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. 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