2017-04-15 54 views
1

我已经升级到Padrino应用程序上的最新Ruby,并且在创建新对象时出现活动记录错误。它将验证一个数字(一个ISBN)为4个字节。错误是:类型在Padrino中将big列投影到bigint Active Record

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 

然后我得到find_byas_json为ISBN字段错误:

#<NoMethodError: undefined method 'type_cast_for_database' for :integer:Symbol

我把 '国际标准书号' 方式进入一个新的实例变量,而不是更改活动记录适配器创建的属性的列。

我知道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。

我打开“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,所以应该避免恕我直言。你有没有机会使用mysql1驱动程序或旧的mysql2驱动程序? – jpgeek

+0

我很想避免它,但无论如何都会出错。似乎问题更深,因为输出是正确的“[#,@ 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宝石的时间,让你知道发生了什么。 – Conor

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 

(我是假设AR for Padrino的工作方式与Rails相似)。

+0

谢谢您的建议。不幸的是验证是在检查字节限制的基础上添加的,所以它不会覆盖默认的4字节限制。 – Conor