我遇到了令人敬畏的Globalize3宝石的麻烦。现在我有两种语言:en和:ru。并且:ru回归:恩喜欢这个
#/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)
并且我想要的唯一简单的事情是获得后备和排序所有togather!所以我们需要以某种方式获取所有记录,只按可用的名称值排序。
有什么办法吗?
答案 0 :(得分:18)
通过挖掘Globalize3源解决了这个问题。它使用with_locales
范围来获取具有适当语言环境的记录。我只需要它们:
Model.includes(:translations).
with_locales(I18n.available_locales).
order('model_translations.name ASC')
希望它会帮助别人!
答案 1 :(得分:3)
本来会留下这个评论,但还没有声誉,所以我不妨留下这个作为答案。
在Rails 4中,当前编写的查询会抛出一个关于隐式连接的长时间弃用警告(这是您通过引用where cause中的model_translations
表来执行的操作)。
我相信您正在尝试返回Model
条记录,而不是Model::Translation
条记录。因此,我认为您可以将includes
替换为join
,这应该更高效,并且可以摆脱弃用警告。
在我的Rails 4应用程序中,联接工作完美,但我还没有在Rails 3中测试它。