11

* update: jest już ustalona w 4.2.stable i 4.2.1 *RangeError do prostego przypisania całkowitą w szynach 4.2.0, które powinny być objęte walidacji

w szynach 4.2.0 (i prądu 4,2 .stable) Sposób ensure_in_range stanie przed potwierdzeniem Ar, otrzymując RangeError

jeśli czegoś tak prostego jak

@obj.threshold = 10_000_000_000 

na kolumnie z Postgresa typ całkowity

threshold | integer      | 

to daje

RangeError: 10000000000 is out of range for ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer with limit 4 from .../2.0.0-p598/lib/ruby/gems/2.0.0/bundler/gems/rails-62e9e61f2d1b/activerecord/lib/active_record/type/integer.rb:41:in `ensure_in_range'

co jest prawdą! ale powiedz to użytkownikom. istnieje model walidacji ActiveRecord jak

validates :threshold, presence: true, 
    numericality: { greater_than_or_equal_to: 0, less_than: 1_000_000} 

nie mogę sobie wyobrazić, jest to normalne zachowanie, ktoś ma żadnego wyjaśnienia, dlaczego tego typu cast dzieje się przed potwierdzeniem?

+0

Znam ten sam problem. Nie domyśliłem się, dlaczego tak się dzieje. – Stefan

+0

Problem jest spowodowany przez wbudowany typowanie w ActiveRecord, które jest wywoływane w ustawieniach atrybutów (jak odkryłeś). Nie wiem, jak to zrobić z góry mojej głowy, ale zastanowię się. –

+0

W czasie pisania tego komentarza aktualizacja do 'rails 4.2.1' rozwiązuje ten problem, w' 4.2.0' nadal otrzymuję 'RangeError'. – jmarceli

Odpowiedz

5

Pobierz najnowszą wersję szyn, aby naprawić ten błąd, it was recently fixed by Sean Griffin

Aby to zrobić, zanim wersja wychodzi, usunąć konkretną wersję w gemfile i używać wskazówkę lokalizacji git:

gem 'rails', :git => 'https://github.com/rails/rails.git' 
+0

niesamowite. dzięki za głowy. W poniedziałek zamierzałem podjąć bardziej drastyczne środki. ;) – whatbird

+1

Czy istnieje obejście tego problemu, ponieważ wciąż otrzymuję komunikat "Nie mogę znaleźć gem 'arel (= 7.0.0.alpha) ruby", który jest wymagany przez gem' rails (> = 0) ruby ​​', w dowolnym z źródła 'podczas próby' bundle install' z tą linią. – Ryan

+0

@Ryan https://github.com/rails/rails/issues/19624. Dodaj to do Gemfile: gem 'arel', github: 'rails/arel' –

0

Jeśli masz jedną walidację, a następnie przejście na Rails 4.2.1 działa. Jeśli jednak masz wiele walidacji, takich jak sprawdzanie wyjątkowości, musisz przejść na nowszą wersję niż 4.2.1. Zmieniłem wersję na 4.2.3. Nie wiem, czy 4.2.2 działa czy nie.

+0

W 4.2.3, 4.2.4 też nie działa: jest poza zakresem dla ActiveRecord :: ConnectionAdapters :: PostgreSQL :: OID: : Integer with limit 4 – Katarzyna

+0

Ograniczam mój "myint" w oparciu o wspomniany wcześniej klejnot Sean Griffin, aby działał. – Katarzyna

0

W moim przypadku dzieje się to również w prostym miejscu, gdzie (some_id: BIG_NUMBER_HERE). Nie opisałbym tego zgodnie z oczekiwaniami, powinno to raczej skutkować w ActiveRecord :: RecordNotFound

2

Możesz zmusić swój plik migracji do użycia BigInta. Miałem ten sam problem, ale nie używam Railsów, ale tylko ActiveRecord. To rozwiąże twój błąd:

t.integer :really_big_int, limit: 8