Rails + Paperclip RangeError

问题描述 投票:0回答:3

我正在开发一个Rails 4.2.5应用程序,它允许使用Paperclip上传视频。它工作正常,除了非常大的文件。使用超过3GB的视频我收到以下错误:

RangeError (3283091012 is out of range for ActiveRecord::Type::Integer with limit 4)

现在我可以说3283091012是文件的大小所以我认为当MySQL试图为paperclip创建的file_size字段保存该值时会发生这种情况,我可以通过增加数据库中的限制来修复它,甚至更好地使用迁移文件,但我以为我之前检查了表结构,我对以下内容感到惊讶:

mysql> describe formats;
+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| id                | int(11)      | NO   | PRI | NULL    | auto_increment |
| video_id          | int(11)      | YES  | MUL | NULL    |                |
| name              | varchar(255) | YES  |     | NULL    |                |
| quality           | varchar(255) | YES  |     | NULL    |                |
| created_at        | datetime     | NO   |     | NULL    |                |
| updated_at        | datetime     | NO   |     | NULL    |                |
| file_file_name    | varchar(255) | YES  |     | NULL    |                |
| file_content_type | varchar(255) | YES  |     | NULL    |                |
| file_file_size    | int(11)      | YES  |     | NULL    |                |
| file_updated_at   | datetime     | YES  |     | NULL    |                |
| trailer           | tinyint(1)   | YES  |     | 0       |                |
+-------------------+--------------+------+-----+---------+----------------+

正如你所看到的那样,file_file_size是一个int(11)而不是错误所声称的4。知道是什么导致了这个吗?

注意:我没有对模型进行任何花哨的验证(只是强制存在一些属性),控制器操作是常规的创建操作。

mysql ruby-on-rails paperclip
3个回答
1
投票

根据MYSQL文档,整数的范围是-2147483648到+2147483647。所以这个类型的数量很大。

更新列并使用参数限制来指示您想要一个bigint。

class ChangeIntegerLimitInYourTable < ActiveRecord::Migration
  def change
    update_column :your_table, :your_column, :integer, limit: 8
  end 
end

1
投票

int(11)中的11和int(20)中的20是这些列的显示宽度。它们不反映用于存储整数的位数;相反,它们可以用于零填充的目的。

11是INT的默认值,因为带符号的4字节整数的最大宽度为-2147483648。类似地,20是BIGINT的默认值,因为8字节整数的最大宽度是-9223372036854775808。

实际上,在更新列之后,我希望file_file_size是bigint(20)。

这里有一个很好的解释。 https://blogs.oracle.com/jsmyth/what-does-the-11-mean-in-int11


0
投票

作为Srv的答案在运行迁移时给了我一个undefined method 'update_column'错误,但这有效:

class ChangeIntegerLimitInFormats < ActiveRecord::Migration
  def self.up
    change_table :formats do |t|
      t.change :file_file_size, :integer, limit: 8
    end
  end
  def self.down
    change_table :formats do |t|
      t.change :file_file_size, :integer, limit: 4
    end
  end
end

在运行迁移后检查表结构显示列file_file_size现在是Int(20)而不是像之前那样的Int(11),不确定4如何转换为11而8转换为20虽然,这是开始时的混乱的根源,如果有人有相关信息,请添加评论。

© www.soinside.com 2019 - 2024. All rights reserved.