当有重音时,在activerecord中按字母顺序区分大小写排序

时间:2014-03-13 10:35:22

标签: ruby-on-rails activerecord

这是我正在使用的模型之一

class WorkPost < ActiveRecord::Base
  default_scope -> { order(:label) }
end

现在,排序将呈现类似

的内容
WorkPost.pluck(:label)
=> ["Chanteur", "Vétérinaire", "responsable du recrutement", "Économiste"]

但是,我希望按字母顺序考虑“É”并且不区分大小写。因此要返回类似的内容:

WorkPost.pluck(:label)
=> ["Chanteur", "Économiste", "responsable du recrutement", "Vétérinaire"]

我希望这可以在ActiveRecord级别完成,以获得良好的性能。

2 个答案:

答案 0 :(得分:3)

您可以通过小写标签更改默认范围:

default_scope order: 'lower(label)'

或者您可以使用大写字母:

default_scope order: 'upper(label)'

希望这会有所帮助

答案 1 :(得分:1)

为了解决案例问题,我们可以使用LHH https://stackoverflow.com/a/22376515/1839692的解决方案。

无论如何解决口音问题,我们都可以使用PostgreSQL扩展unaccent模块。

要安装它:

class AddUnaccentToPostgres < ActiveRecord::Migration[5.2]
  def change
    enable_extension "unaccent"
  end
end

对表进行排序(不带重音(也没有大写)):

default_scope order: 'lower(unaccent(label))'