2017-04-15 9 views
1

Padrino 애플리케이션의 최신 Ruby로 업그레이드했으며 새 오브젝트를 작성할 때 활성 레코드에 오류가 있습니다. 숫자 (ISBN)를 4 바이트로 검증하고 있습니다. 오류 :유형 Padrino의 bigint에 컬럼 캐스팅 활성 레코드

9781407005416 is out of range for ActiveRecord::Type::Integer with limit 4

가 어떻게 8 바이트 제한을 사용하는 루비 액티브 레코드 클래스를 알 수 있습니까?

마이그레이션을 실행하는 것에 대해 이야기하는 것이 아니며, 테이블은 이미 bigint(20)입니다.

나는 생각 일 것이다 다음

class Book < ActiveRecord::Base 
    attribute :isbn, :integer, :limit => 8 
end 

을 나는 다음 ISBN 필드 find_byas_json에 오류를 얻을 : #<NoMethodError: undefined method 'type_cast_for_database' for :integer:Symbol

나는 새로운으로 'ISBN'방법을 설정 활성 레코드 어댑터에 의해 작성된 속성의 컬럼을 변경하는 대신 인스턴스 변수를 사용하십시오.

나는 column has a limit을 알고 있지만 열의 유형에 액세스하여 업데이트하는 방법을 모르겠습니다.

유형 설정에 대한 해결책을 찾지 못하면 활성 레코드 ensure_in_range에서 현재 발생하는 유효성 검사를 건너 뛸 수 있습니다.

DEFAULT_LIMIT = 4class Integer < Value을 내 앱에서 변경하는 방법이 있습니까? 이것은 following changes in Ruby와 관련이 있지만 Padrino 소스를 변경할 수있는 권한이 없습니다.

+0

어떤 데이터베이스를 사용하고 있습니까? – jpgeek

+0

MySQL, 루비 어댑터 큰 int 캡처 및 그에 따라 제한 조정. – Conor

답변

1

어떻게 Ruby 활성 레코드 클래스에 8 바이트 제한을 사용한다고 말합니까? AFAIK, AR은 이것을 데이터베이스 메타 데이터에서 직접 알아 내야합니다.

먼저 앱을 다시 시작하십시오. 이미 완료되지 않은 경우 - 열 유형이 캐시됩니다. 다음으로 AR이 예상대로 열을 실제로 볼 수 있는지 확인합니다. 이것을 생각해보십시오.

p Book.columns.select{ |col| col.name == 'isbn'} 

@cast_type에서 @range 및 @limit를 확인하십시오.

I는 액티브 기록 어댑터에 의해 생성 된 속성의 열을 변경하는 새로운 인스턴스 변수 대신에 'ISBN'방법을 돌렸다.

isbn getter를 (를) 초과 했는가? 그렇다면 정확히 그 코드는 어떻게 생겼을까요?

+0

@Conor - 기꺼이 도와 드리겠습니다. "p Book.columns.select {| col | col.name == 'isbn'}"의 결과는 무엇입니까? Rails 4.2.8에서 mysql2 드라이버 (mysql2-0.4.5)를 사용하여이를 테스트했으며 bigint로 필드를 올바르게 해석하고 위에있는 값을 처리합니다. 참조한 게시물은 sqllite에 관한 것이고 이것에 문제가 있으며 "속성 : upc, Type ..."해킹이 필요할 수도 있지만 MySQL은 그렇지 않아야합니다. 이것은 내부 API이기 때문에 IMHO를 피해야합니다. 혹시 mysql1 드라이버 나 오래된 mysql2 드라이버를 사용하고 있습니까? – jpgeek

+0

나는 그것을 피하고 싶지만 어쨌든 오류가 발생합니다. 출력이 정확할 때 문제가 더 심한 것 같습니다. "[# # ActiveRecord :: ConnectionAdapters :: AbstractMysqlAdapter :: Column : 0x007fbb930f95a0 @ strict = true, @ collation = nil, @ extra =" ", @ name ="isbn ", @ cast_type = # @ sql_type = "bigint (20) null = true, @ default = nil, @ default_function = nil>] ". mysql2 0.4.7을 사용하지만 Rails, Sinatra 2.0.0 및 padrino 0.14.1.1은 사용하지 마십시오. – Conor

+0

protected_attributes gem을 제거 할 때가되면 어떻게 될지 알려줍니다. – Conor

0

시도 :

validates_inclusion_of :isbn, in: 1..4294967296 

(즉, 즉 최대 4 바이트 정수, 2^32입니다.)

또는 8 바이트, 시도 :

validates_inclusion_of :isbn, in: 1..1.8446744e+19 

이 매우 큰 범위를 확인하려면 유효 :

> 1e10.in?(1..1.8446744e+19) 
true 
> 1e20.in?(1..1.8446744e+19) 
false 

Padrino에 대한 AR이 Rails에서 작동한다고 가정)

+0

제안 해 주셔서 감사합니다. 불행하게도 유효성 검사는 바이트 제한 검사의 맨 위에 추가되므로 기본 제한 인 4 바이트를 대체하지 않습니다. – Conor