繁体   English   中英

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

[英]Rails - Specify a fixed length column in DB migration with PostgresSQL

似乎在列修饰符中只有:limit ,它指定此列的最大长度。 但是,如果我想指定长度正确怎么办? 例如,手机号码必须包含11位数字,因此我不希望用户输入无效的号码。 当然,我也可以在模型逻辑甚至前端进行验证,但是在数据库级别添加约束似乎更安全。 有没有办法在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-core( https://github.com/vprokopchuk256/mv-core )。 它允许您以与Rails中类似的方式定义db级验证。

例如,使用该gem可以通过两种方式解决您的问题:

  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验证行为

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM