55

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

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

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

它提供了一个非常好的不区分大小写的搜索。我无法为 postgresql 复制这个。应该很容易 - 有什么想法吗?

谢谢。

4

5 回答 5

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

从布拉德和弗兰克那里吸取一点教训。

于 2010-06-06T12:44:18.820 回答
29

LanecH 的答案适用于 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
于 2014-06-21T09:31:48.347 回答
27

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

弃用警告:使用非属性参数调用的危险查询方法(其参数用作原始 SQL 的方法):“LOWER(?) ASC”。

另一种方法可能是依赖 Arel(它现在已合并到 Rails 中):

results = User.order(User.arel_table['name'].lower.asc)
# results.to_sql == "SELECT \"users\".* FROM \"users\" ORDER BY LOWER(\"users\".\"name\") ASC" 
于 2018-05-01T10:26:43.313 回答
6

您是否考虑将列存储为citext类型?据我了解,它实际上只是内化了对 lower() 的调用。之后它会自动为您服务。如果有时您需要区分大小写的搜索,但这可能不是最好的主意。

于 2010-06-06T21:30:45.703 回答
5

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

于 2010-06-06T09:57:34.820 回答