2011-05-15 3 views
9

내 응용 프로그램 중 하나에 이상한 버그가 있습니다.레일 3과 양식에서 십진수 값 저장

sqlite3 데이터베이스를 사용할 때 버그가 없습니다. 그러나 데이터베이스 어댑터로 mysql2를 사용할 때 폼에서 십진수 값을 저장하는 중에 오류가 발생합니다.

나는 소수가 제거 된 후 값 19.99 내 입력을 제출하고이 원인이 무엇 19.00

으로 데이터베이스에 저장되어있는 경우? 데이터베이스에 열에 대한 올바른 설정이 있고 레일 콘솔을 사용하여 올바른 레코드를 만들 수 있습니다.

편집 : 내가 10 진법을 실제로 말하고 싶을 때의 정수.

+0

은 올바르게 저장되는 값입니다 MySQL의 테이블? – Zabba

+0

아니, 레일 로그에서 볼 수있는 한 올바르게 MySQL에 제출됩니다. sscirrus의 솔루션을 염두에두고 마이그레이션을 다시 편집 할 수 있는지 확인하고 모든 사항이 올바른지 확인합니다. –

답변

14

내가이 이러한 가능성 중 하나가 될 수 있다고 생각 :

  1. 레일즈 모델의 검증 (또는 컨트롤러의 일부 단계) 정수로 값을 설정하거나, 적어도 소수를 절단되고, 데이터베이스에 저장하기 전에. 이 경우 귀하의 로그에 INSERT 작업을 확인하고 가에 넣어 시도되는 데이터 레일 볼 볼 수 있습니다.

  2. 를 레일 19.00 대신 19.99을 보내는 경우에, 당신은 대부분 작은 차이가 사이가 두 데이터베이스의 데이터 형식 귀하의 MySQL 데이터베이스가 단순히 소수점 2 이상 저장되지 않는 경우 확인하십시오. 기본적으로 MySQL은 정밀도가 10이고 스케일이 0 인 데이터 유형을 저장하므로 십진수를 저장하지 않습니다. # 2 문제가있는 경우

이 솔루션은 같은 이동과 '변화'규모를 지정하여 필드 유형, 뭔가를 생성하는 것입니다

# 'up' portion of a new migration 
def self.up 
    change_column :mymodel, :myfield, :decimal, :precision => 6, :scale => 2 
end 
+0

고마워요! 너는 내 머리카락을 찢어 내지 못하게했다. 나는 마이 그 레이션에서 오타가 있었음에 틀림 없다. 해결 방법은 마이 그 레이션에서 열 정의의 끝에 precision => 6, : scale => 2를 추가하는 것이 었습니다. –

+0

@DevinM - 당신을 가장 환영합니다! – sscirrus

+1

동일한 테이블에서 변경할 열이 여러 개인 경우 다음 다른 구문을 사용하는 것이 좋습니다. change_table : mymodel do | t | t.change : myfield, : 10 진수, : precision => 6, : scale => 2 –