Rails与Postgres的大小写敏感应用程序问题

3
我正在运行一个基于Postgresql的新Rails应用程序,但我不明白为什么他们把Postgresql设置成区分大小写,甚至没有提供关闭此功能的选项。
我的意思是,如果有人在我的网站上注册为“Sam”,那么他将无法使用“sam”登录,但可能会出现两个不同的帐户“Sam”和“sam”。这是一场灾难,特别是考虑到所有其他主要数据库都不区分大小写。
现在,查找用户时,不再只需要按照用户名搜索,还需要检查每种可能的大小写组合。这是非常麻烦的,并且容易导致错误。
User.find_by_name(params[:name])

我必须这样做。

User.all(:conditions=>["name ILIKE ?", params[:name]]).first

我无法相信在Rails中没有避免这种情况的方法,因为这破坏了框架的主要原则:数据库独立性。
是否有更好的方法来实现不区分大小写的用户名/电子邮件模式?

5
那完全是你的问题。在账户创建时,你应该将用户名转换为小写。不要责怪工具。此外,SO是用来提问的,而不是发牢骚的。 - user229044
@meagar,我同意,这篇文章有点“愤怒”。但是我不是对的吗?好吧,如果我在创建时将帐户名称转换为小写,用户如何使用大写字母登录呢? - Alex
4
@Alex:User.find_by_name(params[:name].downcase) - Mark Thomas
1
@Alex,就像@Mark所说的那样。这是非常标准的程序。 - user229044
1
哦...这还不错。如果这就是我需要做的全部,那我肯定错了。请将此作为单独的答案发布,以便我可以接受它。谢谢。 - Alex
我按照你说的做了,它运行得很好,除了...当有人想要一个像"TheUser"这样显示的用户名时,在数据库中它将被存储为"theuser"。有没有办法绕过这个问题? - Alex
3个回答

3

有一个名为citext的贡献模块可创建不区分大小写的文本类型。我认为它只在pg 9.0及以上版本中默认包含。

此外,您可以轻松创建唯一索引以防止sam、Sam和SAM同时拥有帐户:

create table abc (users text); create unique index abc_users_ci on abc (upper(users)); insert into abc values ('sam'); insert into abc values ('Sam'); ERROR: duplicate key value violates unique constraint "abc_users_ci"

完成了!或者你也可以抱怨pgsql不像mysql那样。


1

如果大小写保留对您很重要,我想您可以有两个数据库列:

  • 一个用于登录名,在用户注册时始终将其转换为小写,并在从登录表单转换名称为小写后用于登录用户
  • 一个用于显示名称,这是作为用户名显示的内容,正是用户在注册时提供给您的

一开始我并没有理解,但现在我意识到这正是我需要的。谢谢! - Alex

1
特别是考虑到所有其他主要数据库都不区分大小写的事实,这一点尤其重要。
这并不完全正确。Oracle、DB2和Firebird默认情况下是区分大小写的。
但我同意,有这样一个选项有时会使事情变得更容易一些。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接