【问题标题】:Sort list based on their i18n translation根据 i18n 翻译排序列表
【发布时间】:2018-08-28 17:53:23
【问题描述】:
鉴于我的数据库中有一个项目列表,以及它们在 i18n 文件中的相应翻译。
i18n 文件:
basic_categories:
item_1: Z
item_2: A
item_3: F
在视图上:
<% @basic_categories.each do |category| %>
<%= t("basic_categories.#{category.name}") %>
<% end %>
如何对每种语言的列表进行排序?
【问题讨论】:
标签:
ruby-on-rails
sorting
internationalization
【解决方案1】:
如果您的列表太长,出于性能原因,您可能希望将翻译保存在数据库中。 MySQL 排序比 ruby 快。
否则我认为你可以这样做:
在您的控制器中,使用 ruby 构建字符串或哈希数组:
@basic_categories = categories.collect { |category|
{ :name => I18n.t("basic_categories.#{category.name}"), ... }
}.sort_by { |category| category[:name] }
然后用 ruby 排序,见http://ruby-doc.org/core/classes/Enumerable.html
在你看来简单:
<% @basic_categories.each do |category| %>
<%= category[:name] %>
...
<% end %>
【解决方案2】:
您还可以将带有翻译的 json 传递给 PG 查询,然后按 json 中的翻译值排序:
categories_i18n = I18n.backend.instance_variable_get(:@translations).dig(:en, :basic_categories).to_json
@basic_categories = categories.order("'#{categories_i18n}::json'->>name")