diff options
Diffstat (limited to 'activerecord/lib/active_record/type/integer.rb')
-rw-r--r-- | activerecord/lib/active_record/type/integer.rb | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/type/integer.rb b/activerecord/lib/active_record/type/integer.rb index 08477d1303..2b0f0b2734 100644 --- a/activerecord/lib/active_record/type/integer.rb +++ b/activerecord/lib/active_record/type/integer.rb @@ -15,9 +15,28 @@ module ActiveRecord case value when true then 1 when false then 0 - else value.to_i rescue nil + else + result = value.to_i rescue nil + ensure_below_max(result) if result + result end end + + def ensure_below_max(value) + if value > max_value + raise RangeError, "#{value} is too large for #{self.class} with limit #{limit || 4}" + end + end + + def max_value + @max_value = determine_max_value unless defined?(@max_value) + @max_value + end + + def determine_max_value + limit = self.limit || 4 + 2 << (limit * 8 - 1) # 8 bits per byte with one bit for sign + end end end end |