我正在使用 Ruby on Rails。我想将用户名存储到数据库中,当我提取它们时,我希望它们具有与输入时相同的大小写,但我想添加一些不区分大小写的验证,以确保无论如何都不能使用相同的用户名大写。
我这样说是因为并非所有数据库适配器都使用区分大小写的索引,因此我需要在将用户名保存到数据库之前将其小写。
所以模型中的验证是这样的:
uniqueness: { case_sensitive: false }
我该怎么做呢?
我正在使用 Ruby on Rails。我想将用户名存储到数据库中,当我提取它们时,我希望它们具有与输入时相同的大小写,但我想添加一些不区分大小写的验证,以确保无论如何都不能使用相同的用户名大写。
我这样说是因为并非所有数据库适配器都使用区分大小写的索引,因此我需要在将用户名保存到数据库之前将其小写。
所以模型中的验证是这样的:
uniqueness: { case_sensitive: false }
我该怎么做呢?
我想到了几种方法。
简单的
您可以进行区分大小写的模型级别验证,就像您正在做的那样,并且根本不验证数据库中的唯一性。
丑陋的
或者,如果您坚持数据库级别的验证,那么一种与数据库无关的脏方法可能是拥有另一个字段,仅用于验证。
add_column :users, :uppercase_username, :string, unique: true
class User
def username=
@username = value
uppercase_username = value.upper
end
end
惊人的
您可以定义自己的索引函数(可能是特定于数据库的)。
您提到的验证 ( uniqueness: { case_sensitive: false }
) 不会在存储用户名时更改用户名的大小写,而是会简单地检查是否存在相同的电子邮件。本质上,鉴于您当前的验证,您不必担心这个问题。