如何使用postgresql在Rails中执行不区分大小写的顺序

时间:2010-06-06 09:18:25

标签: ruby-on-rails ruby postgresql sql-order-by case-insensitive

我正在将我的开发环境从sqlite3切换到postgresql 8.4并且有最后一个障碍。

在我的原文中,我在辅助方法中有以下行;

result = Users.find(:all, :order => "name collate NOCASE")

提供了一个非常好的不区分大小写的搜索。我不能为postgresql复制这个。应该很容易 - 任何想法?

感谢。

5 个答案:

答案 0 :(得分:79)

result = Users.find(:all, :order => "LOWER(name)")

从Brad和Frank那里拿走一点。

答案 1 :(得分:24)

LanecH's answer适用于Rails 3+(包括Rails 4和5):

users = User.order('LOWER(name)')

或者创建一个可以重复使用的命名范围:

class User < ActiveRecord::Base
  scope :order_by_name, -> { order('LOWER(name)') }
end

users = User.order_by_name

答案 2 :(得分:15)

现在使用Rails 5.2,如果使用接受的答案,您可能会收到警告。

  

DEPRECATION WARNING:危险的查询方法(其参数的方法   被用作原始SQL)调用非属性参数:&#34; LOWER(?)   ASC&#34;

替代方案可能依赖于Arel(它现在合并到Rails中):

results = User.order(User.arel_table['name'].lower.asc)
# results.to_sql == "SELECT \"users\".* FROM \"users\" ORDER BY LOWER(\"users\".\"name\") ASC" 

答案 3 :(得分:6)

您是否考虑过将列保存为citext类型?根据我的理解,它真的只是内部化对lower()的调用。之后对你来说会是自动的。如果有时您需要区分大小写的搜索,那么这可能不是最好的主意。

答案 4 :(得分:5)

在SQL中,您可以使用ORDER BY LOWER(columnname),不知道如何在Ruby中执行此操作。功能索引(也在LOWER(列名)上)将有助于加快速度。

相关问题