ruby-on-rails - 在 Ruby/Rails 中使用特定排序规则对值进行排序

标签 ruby-on-rails ruby ruby-on-rails-3 internationalization collation

是否可以使用 Ruby 中的特定排序规则对值数组进行排序?我需要根据 da_DK 排序规则进行排序。

给定数组 %w(Aarhus Aalborg Assens) 我想要 ['Assens', 'Aalborg', 'Aarhus'] 返回正确的用丹麦语订购。

标准排序方法

%w(Aarhus Aalborg Assens).sort

返回一些看起来像 ascii 顺序的东西(至少不是丹麦顺序):

["Aalborg", "Aarhus", "Assens"]

环境是 Snow Leopard 和运行 ruby​​ 1.9.2 和 Rails 3.0.5 的 linux。

最佳答案

根据 Wikipedia :

In the Danish and Norwegian alphabets, the same extra vowels as in Swedish (see below) are also present but in a different order and with different glyphs (..., X, Y, Z, Æ, Ø, Å). Also, "Aa" collates as an equivalent to "Å". The Danish alphabet has traditionally seen "W" as a variant of "V", but today "W" is considered a separate letter."

这会影响排序。

执行此操作以解决问题:

names = %w(Aarhus Aalborg Assens)
names.sort_by { |w| w.gsub('Aa', 'Å') } # => ["Assens", "Aalborg", "Aarhus"]

对于具有复合字符组合以转换为单个字符的其他字母,还有类似的东西。

这样做的原因是 sort_by 做了一个 Schwartzian Transformation ,因此它实际上是按 block 返回的返回值排序,在本例中,返回值是用“Å”替换了“Aa”的名称。替换是临时的,并在数组排序时丢弃。

sort_by 非常强大,但确实有一些开销。对于简单的排序,您应该使用 sort 因为它更快。对于在对象的顶层比较两个简单值的排序,那么使用 sort 还是 sort_by 就成了一个问题。如果您必须进行更复杂的计算或在对象中四处挖掘,那么 sort_by 可以证明更快。并没有真正一成不变的方法可以知道哪个更好,所以如果您必须对大型数组进行排序或处理对象,我强烈建议使用基准进行测试,因为差异可能很大,有时 sort 可能是更好的选择。

编辑:

Ruby 本身不会做你想做的事,因为它不知道那里设置的每个字符的排序顺序。有一个 discussion关于合并IBM's ICU这解释了为什么会这样。如果你想要 ICU 的能力,你可以查看 ICU4R .我没有玩过它,但它听起来像是你在 Ruby 中唯一真正的解决方案。

您也许可以使用像 Postgres 这样的数据库来做一些事情。它们支持各种排序选项,但通常会强制您在创建数据库时声明排序规则……或者可能是在创建表时……自从我创建新表以来已经有一段时间了。无论如何,这是一种选择,尽管这会很痛苦。

关于ruby-on-rails - 在 Ruby/Rails 中使用特定排序规则对值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5465706/

相关文章:

ruby - 为 Mongo DB 存储格式化 JSON 日期的最佳方法是什么

ruby-on-rails - rails : money gem converts all amounts to zero

ruby-on-rails - Heroku 迁移 : type modifier is not allowed for type "bytea"

ruby-on-rails - rails : Is devise vulnerable to session hijacking?

ruby-on-rails - Ruby Do 循环和迭代

ruby-on-rails - Rails CSRF token 真实性和设计

Javascript 在本地工作但不在生产环境中工作

ruby-on-rails - rails :dependent => :destroy VS :dependent => :delete_all

javascript - 第一次加载页面时没有加载任何js文件

ruby-on-rails - 如何访问 ActiveModel 验证错误的翻译 key ?