2013-01-08 3 views
1

데이터베이스의 십진수 인 열 amount이있는 모델이 있습니다. 이 모델을 인스턴스화 할 때 특정 정확도를 가진 BigDecimal 만 제공되도록하고 싶습니다. Float이 제공 될 때 시나리오를 테스트하기위한 사양을 작성한 다음 before_create 콜백을 사용하여 BigDecimal이 아닌 경우 오류가 발생합니다.제어 ActiveRecord 생성 인수 유형 및 특성

그러나 값이 before_create 콜백에 도달 할 때까지 레일스는 이미 BigDecimal으로 변환했습니다. 이것은 내가 생각하기에 좋으며, 아마도 정밀도를 검사 할 수는 있지만, 레일이 어떻게 변환되는지 정확하게 알지 못하기 때문에 올바른 인수 유형과 정밀도를 확인하는 것이 좋을 것입니다.

이렇게 할 방법이 있습니까?

답변

1

때때로

http://api.rubyonrails.org/classes/ActiveRecord/Base.html에서 무시하려고합니다. 이는 모든 속성에있는 _before_type_cast 접근자를 사용하여 수행 할 수 있습니다. 예를 들어 계정 모델에 잔액 특성이있는 경우 account.balance_before_type_cast 또는 account.id_before_type_cast를 호출 할 수 있습니다.

+0

완전히 완벽합니다. –

0

는 열 결정 배역 먼저 그것의 과정을 실행하지 않고도 원시 속성 데이터를 읽을 수 있도록하려면 amount=

def amount=(val) 
    # checking/conversion goes here, new_val as result 
    self[:amount] = new_val # don't use self.amount = new_val to avoid endless loop 
end