在Rails迁移中限制整数大小

时间:2014-10-26 22:29:49

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

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

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

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:6)

你这一切都错了。电话号码一个号码,电话号码是包含(大部分)数字字符的字符串。你不会做任何数字化的事情 - 例如算术 - 用电话号码,所以他们不是数字,他们是字符串。

因此,请将phone_number列设为长度为8的字符串:

t.string :phone_number, :limit => 8

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

before_validation :clean_up_phone_number
validates :phone_number, :format => { :with => /\A\d{8}\z/ }

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

答案 1 :(得分:0)

或者你可以用这种方式在迁移中使用mv-core gem(https://github.com/vprokopchuk256/mv-core)(语法几乎与AciveModel :: Validations一样):

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约束。但你可以改变它来触发约束,例如。 请参阅文档中的详细信息。