Rails-使用PostgresSQL在数据库迁移中指定一个固定长度的列



在列修饰符中似乎只有:limit,它指定了该列的最大长度。但是,如果我想准确地指定长度,该怎么办?例如,一个手机号码必须有11位数字,所以我不希望用户输入无效的号码。当然,我也可以在模型逻辑甚至前端进行验证,但在DB级别添加约束似乎更安全。有没有办法在Rails中实现这一点?或者我必须使用Postgre特定的命令。如果是,如何?

谢谢!

Rails本身只支持一组有限的约束。您可以通过execute运行任意SQL命令,不过:

class CreateAddresses < ActiveRecord::Migration
  def change
    create_table(:addresses) do |t|
      t.string :phone_number, null: false
    end
    execute "ALTER TABLE addresses ADD CONSTRAINT addresses_phone_length CHECK (length(phone_number) = 11)"
  end
end

您可以使用mv核心(https://github.com/vprokopchuk256/mv-core)为此。它允许您以类似于Rails的方式定义数据库级验证。

例如,您的问题可能会通过两种方式得到解决:

  1. 作为预定义验证
def change
  create_table :addresses do |t|
    t.string :phone_number, length: 11
  end
end
  1. 作为自定义验证
def change
  create_table :addresses do |t|
    t.string :phone_number, validates: 'TRIM(LENGTH({phone_number})) = 11'
  end
end
  1. 作为带有自定义消息的预定义验证:
def change
  create_table :addresses do |t|
    t.string :phone_number, 
      validates: { length: { is: 11, message: 'should have length == 11' } }
  end
end

如果您需要,数据库验证可以升级为标准ActiveModel验证:

class Address < ActiveRecord::Base
  enforce_migration_validations
end

因此,您将拥有标准的ActiveRecord验证行为

相关内容

  • 没有找到相关文章

最新更新