【问题标题】:Limit integer size in Rails migration在 Rails 迁移中限制整数大小
【发布时间】:2014-10-26 22:29:48
【问题描述】:

如何在 Rails 4 迁移中指定整数大小的限制? (我的数据库是 PostgreSQL。)

我有phone_number 的字段,长度应为 8 位。如果我指定:limit => 8,那就是字节大小而不是数字的长度。

有没有办法做到这一点?

【问题讨论】:

  • 我认为我们不能在迁移时对整数设置限制,而是您可以在将记录保存到数据库之前检查validates_length_of,您可以在其中指定您希望允许该特定字段的数字长度,如下所示:validates_length_of :phone_number, :maximum => 8

标签: ruby-on-rails postgresql rails-migrations


【解决方案1】:

这一切都错了。电话号码根本不是数字,电话号码是包含(大部分)数字字符的字符串。您不会对电话号码进行任何数字运算(例如算术运算),因此它们不是数字,而是字符串。

使您的 phone_number 列成为长度为 8 的字符串:

t.string :phone_number, limit: 8

清理并验证模型中的格式:

before_validation :clean_up_phone_number
validates :phone_number,
  format:    { with: /\A\d{8}\z/ },
  length:    { maximum: 8 },
  allow_nil: true

def clean_up_phone_number
  # Do whatever you want or need to strip out spaces, hyphens, etc. in here
end

或者最好使用 PostgreSQL,完全不用担心数据库的大小,使用t.string :phone_number。大小限制只会增加无意义的开销,使用普通的 varchar 而不是 varchar(8) 可以更容易地允许以后使用不同的电话号码格式(区号、分机号、国际号码等)。

【讨论】:

    【解决方案2】:

    或者您可以在迁移中以这种方式使用 mv-core gem (https://github.com/vprokopchuk256/mv-core) 执行此操作(语法几乎与 AciveModel::Validations one 相同):

    def change
      update_table :users do |table|
        t.string :phone_number, 
                 validates: { length: 8, 
                              format: /\A\d{8}\z/,
                              allow_blank: true, 
                              allow_nil: true }
      end
    end
    

    然后将该验证冒泡到您的模型中:

    class User < ActiveRecord::Base
      enforce_migration_validations
    end
    

    默认情况下,您的验证将被定义为 PostgreSQL 的 CHECK 约束。但是您可以将其更改为触发约束,例如。 请参阅文档中的详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 2017-10-31
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      相关资源
      最近更新 更多