2017-04-15 56 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