4

我遇到了很棒的 Globalize3 gem 的麻烦。现在我有两种语言:en 和 :ru。并且 :ru 像这样回退到 :en

#/config/initializers/globalize.rb
Globalize.fallbacks = {:ru => [:ru, :en]}

在我的控制器中,我试图通过名称翻译或翻译后备值对整个翻译记录集合进行排序。但with_translations()似乎没有给我这样的机会!

Country.with_translations(:ru).order('country_translations.name ASC')
#this filters out those who have no :ru translations (BUT THEY SHOLD USE FALLBACKS!)

所以要检索所有记录,我可以传递一个语言环境数组:

Country.with_translations([:ru, :en]).order('country_translations.name ASC')
#but this completely ruins the sorting order (DAMN NOTHING IS SORTED)

我想要的唯一简单的事情就是把后备和整理在一起!所以我们需要以某种方式让所有记录仅按可用名称值排序。

有什么办法吗?

4

2 回答 2

19

通过深入研究 Globalize3 源解决了这个问题。它使用with_locales范围来获取存在适当语言环境的记录。我只需要它们:

Model.includes(:translations).
       with_locales(I18n.available_locales).
       order('model_translations.name ASC')

希望它会帮助别人!

于 2013-04-19T12:27:19.643 回答
3

本来会留下这个作为评论,但还没有声誉,所以我想我不妨把这个作为答案。

  1. 在 Rails 4 中,当前编写的查询会引发关于隐式连接的长时间弃用警告(这是您通过model_translations在 where 原因中引用表所做的事情)。

  2. 我相信您正在尝试返回Model记录,而不是Model::Translation记录。因此,我认为您可以将 a 换成includesa join,它应该会更高效并摆脱弃用警告。

在我的 Rails 4 应用程序中,连接运行良好,但我还没有在 Rails 3 中对其进行测试。

于 2014-11-16T05:30:42.387 回答