在Padrino Active Record中键入将一个列转换为bigint

时间:2017-04-15 21:00:17

标签: ruby rails-activerecord padrino

我已经升级到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_byas_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源。

2 个答案:

答案 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中一样。)