whatbird
whatbird

Reputation: 1562

RangeError for simple integer assignment in Rails 4.2.0 that should be caught by validation

* UPDATE: this is now fixed in 4.2.stable and 4.2.1 *

in Rails 4.2.0 (and current 4.2.stable), the ensure_in_range method happens before AR validation, yielding a RangeError

if I do something as simple as

@obj.threshold = 10_000_000_000

on a column with a postgres type integer

 threshold  | integer                     | 

it yields

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'

which is true! but tell that to the users. there's an ActiveRecord model validation like

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

i can't imagine this is expected behavior, anyone have any explanation why this type cast happens before validation?

Upvotes: 12

Views: 5861

Answers (4)

Fran Martinez
Fran Martinez

Reputation: 3042

You can force your migration file to use a BigInt. I had the same problem but I am not using Rails but just ActiveRecord. This will solve your bug:

t.integer :really_big_int, limit: 8

Upvotes: 2

januszm
januszm

Reputation: 1245

In my case this also happens on simple where(some_id: BIG_NUMBER_HERE). I wouldn't describe it as expected, this should rather result in ActiveRecord::RecordNotFound

Upvotes: 0

Andrew Grimm
Andrew Grimm

Reputation: 81480

If you have a single validation, then upgrading to Rails 4.2.1 does the trick. However, if you've got multiple validations, such as also validating uniqueness, you have to upgrade to a more recent version than 4.2.1. I upgraded to 4.2.3. I don't know whether 4.2.2 works or not.

Upvotes: 0

jazzytomato
jazzytomato

Reputation: 7214

Get the latest rails version to fix this error, it was recently fixed by Sean Griffin

To do that before a version comes out, remove the specific version in your gemfile and use the git location hint :

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

Upvotes: 5

Related Questions