我正在将我的开发环境从sqlite3切换到postgresql 8.4并且有最后一个障碍。
在我的原文中,我在辅助方法中有以下行;
result = Users.find(:all, :order => "name collate NOCASE")
提供了一个非常好的不区分大小写的搜索。我不能为postgresql复制这个。应该很容易 - 任何想法?
感谢。
答案 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(列名)上)将有助于加快速度。