我已经升级到Padrino应用程序上的最新Ruby,并且在创建新对象时遇到活动记录错误。它将一个数字(ISBN)验证为4个字节。错误是:
9781407005416 is out of range for ActiveRecord::Type::Integer with limit 4
如何告诉Ruby活动记录类使用8字节限制?
我不是在谈论运行迁移,该表已经是bigint(20)
。
我认为以下内容可行:
class Book < ActiveRecord::Base
attribute :isbn, :integer, :limit => 8
end
然后,我在ISBN字段的find_by
和as_json
上收到错误:
#<NoMethodError: undefined method 'type_cast_for_database' for :integer:Symbol
我将'isbn'方法转换为新的实例变量,而不是更改活动记录适配器创建的属性列。
我知道column has a limit,但不知道如何访问列的类型来更新它。
落入类型设置的解决方案有一种方法可以跳过现在在活动记录ensure_in_range
中发生的验证。
有没有办法从我的应用中更改DEFAULT_LIMIT = 4
的内置class Integer < Value
?这与following changes in Ruby有关,但我无权更改Padrino源。
答案 0 :(得分:1)
如何告诉Ruby活动记录类使用8字节限制? AFAIK,AR应该直接从数据库元数据中找出这一点。
首先,如果尚未重新启动应用程序,则会缓存列类型。接下来,我将验证AR实际上是否按预期看到了列。试试这个以确保它按照你的想法行事:
p Book.columns.select{ |col| col.name == 'isbn'}
查看@cast_type下的@range和@limit。
我转过了'isbn&#39;将方法转换为新的实例变量而不是 更改活动记录创建的属性列 适配器。
这是否意味着你超越了isbn getter?如果是这样,该代码到底是什么样的?
答案 1 :(得分:0)
尝试:
validates_inclusion_of :isbn, in: 1..4294967296
(那是2 ^ 32,即最大4字节整数。)
或者对于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中一样。)