使用Postgres对Rails区分大小写的应用程序

时间:2010-11-15 17:39:10

标签: ruby-on-rails postgresql case-sensitive

我正在Postgresql上运行一个新的Rails应用程序,我不明白为什么在地球上他们使Postgreql区分大小写,甚至没有选择关闭它。

我的意思是,真的,如果有人在我的网站上注册为“Sam”,将无法以“sam”身份登录,但可能有两个不同的帐户“Sam”和“sam”。这是一场灾难,尤其是考虑到所有其他主要数据库都不区分大小写的事实。

现在不是寻找像

这样的用户
User.find_by_name(params[:name])

我必须这样做

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

我无法相信在Rails中无法避免这种情况,因为它破坏了框架的一个主要原则:数据库独立性。

是否有更好的方法来实现不区分大小写的用户名/电子邮件架构?

3 个答案:

答案 0 :(得分:3)

有一个名为citext的contrib模块,它创建一个不区分大小写的文本类型。我认为默认情况下它只包含在第9.0页开始。

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

创建表abc(用户文本); 在abc上创建唯一索引abc_users_ci(upper(users)); 插入abc值('sam'); 插入abc值('Sam'); 错误:重复键值违反唯一约束“abc_users_ci”

多田!或者你可以抱怨pgsql不像mysql。

答案 1 :(得分:1)

我想你可以有两个DB列,如果保留案例对你很重要:

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

答案 2 :(得分:1)

  

特别考虑到   所有其他专业的事实   数据库不区分大小写

这根本不是真的。默认情况下,Oracle,DB2和Firebird区分大小写

但我同意,有这样的选择会让事情变得容易一些。