我想验证用户名不是以下之一。 ["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
我想知道我是否也可以在数据库级别验证这一点(可能使用迁移文件?)。这可以针对上述特定案例进行吗?
似乎也鼓励这种做法在数据库级别使用某些约束可能是个好主意。 此外,数据库级验证可以安全地处理一些事情 (例如在频繁使用的表中的唯一性)可能很难 以其他方式实施。
答案 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