数据库级别的模型属性数据验证

时间:2012-12-02 22:19:43

标签: ruby-on-rails migration

我想验证用户名不是以下之一。 ["admin", "moderator", "mod", "administrator"]

我确实使用自定义验证器确认模型级别不允许使用这些名称。

class User < ActiveRecord::Base
  ...
  validate :username_should_not_be

  def username_should_not_be
    not_allowed = ["admin", "moderator", "mod", "administrator"]
    if not_allowed.include?(username.downcase)
      error.add(:username, "is not allowed.")
    end
  end
  ...
end

我想知道我是否也可以在数据库级别验证这一点(可能使用迁移文件?)。这可以针对上述特定案例进行吗?

Rails guide以及

似乎也鼓励这种做法
  

在数据库级别使用某些约束可能是个好主意。   此外,数据库级验证可以安全地处理一些事情   (例如在频繁使用的表中的唯一性)可能很难   以其他方式实施。

1 个答案:

答案 0 :(得分:0)

你可以使用postgSQL的mv-postgresql gem和SQLite的mv-sqlite gem。这两个gem都是Migration Validator项目的一部分(请参阅此处的详细信息:https://github.com/vprokopchuk256/mv-core

使用该gem,您可以在db级别定义验证。在你的情况下:

def up
  validates :users, :username, 
             exclusion: ["admin", "moderator", "mod", "administrator"]
end

def down
   validates :users, :username, exclusion: false
end

然后你(最好)将验证传播给你的模型:

class User < ActiveRecord::Base
  enforce_migration_validations
end

结果:

User.new(username: 'admin').valid?
=> false

User.new(username:  'jasoki').valid?
=> true