我正在将我的开发环境从 sqlite3 切换到 postgresql 8.4 并且有最后一个障碍。
在我的原作中,我在辅助方法中有以下行;
result = Users.find(:all, :order => "name collate NOCASE")
它提供了一个非常好的不区分大小写的搜索。我无法为 postgresql 复制这个。应该很容易 - 有什么想法吗?
谢谢。
我正在将我的开发环境从 sqlite3 切换到 postgresql 8.4 并且有最后一个障碍。
在我的原作中,我在辅助方法中有以下行;
result = Users.find(:all, :order => "name collate NOCASE")
它提供了一个非常好的不区分大小写的搜索。我无法为 postgresql 复制这个。应该很容易 - 有什么想法吗?
谢谢。
result = Users.find(:all, :order => "LOWER(name)")
从布拉德和弗兰克那里吸取一点教训。
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
现在使用 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"
您是否考虑将列存储为citext类型?据我了解,它实际上只是内化了对 lower() 的调用。之后它会自动为您服务。如果有时您需要区分大小写的搜索,但这可能不是最好的主意。
在 SQL 中,您可以使用 ORDER BY LOWER(columnname),不知道如何在 Ruby 中执行此操作。功能索引(也在 LOWER(columnname) 上)将有助于加快速度。