0

我想验证用户名不是以下之一。["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 指南似乎也鼓励这种做法

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

4

1 回答 1

0

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

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

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
于 2015-01-29T11:28:59.210 回答