2010-08-29 74 views
13

我试图使用与globalize2翻译的字段来排序查询。问题是,既然存储在数据库和关联中,我遇到了很多问题。如何使用全球化翻译字段排序查询

  • 做一个包括翻译和订购category_translations.name不起作用。
  • 我尝试了default_scope但因为它不允许使用拉姆达或块的条件,除非我用这个补丁的ActiveRecord http://gist.github.com/81187
  • 我试着在规定的with_translations我不能让它工作globalize2,但是我得到了一个错误,我甚至无法让它工作,即使没有订购。

我有类似的东西

class Category < ActiveRecord::Base 
    validates_presence_of :name 
    validates_uniqueness_of :name 
    has_many :products, :dependent => :destroy 

    translates :name 
end 

的问题是,如何订购由转换后的名字吗?

回答

1

我测试了这个使用sqlite3,它的工作原理。

class Category < ActiveRecord::Base 
    ... 
    named_scope :ordered, lambda {|locale| 
    { 
     #:select => "categories.*, categories.name sort_name", 
     # For MySQL 
     #:select => "categories.*, IF(category_translations.name IS NULL, categories.name, category_translations.name) sort_name", 
     # For sqlite3 
     :select => "categories.*, (CASE WHEN category_translations.name IS NULL THEN categories.name ELSE category_translations.name END) sort_name", 
     :joins => ActiveRecord::Base.sanitize_sql_array([ 
     "LEFT JOIN category_translations on category_translations.category_id = categories.id AND category_translations.locale = ?", locale]), 
     :order => "sort_name" 
    } 
    } 
    ... 
end 

Category.ordered(some_locale).all # Returns all records, sorted by translated name 
+0

当然是INNER JOIN假设所有类别都存在翻译。如果不是,它需要一些调整。 – aceofspades 2010-09-10 22:33:08

+0

感谢您的回复。是的,这是我尝试的第一件事,但由于并非所有翻译都存在,所以没有解决我的问题...... – Fran 2010-09-11 08:33:01

+0

有多一点时间做一个测试用例,请给这个最新版本。希望能帮助到你! – aceofspades 2010-09-11 16:52:18

1

我假设称为Category任何模型将最多有几百记录,如果不是更少。也许你可以考虑在获取结果后在内存中对结果进行排序。

@categories = Category.all # or whatever else to retrieve what you want 
@categories.sort! { |a,b| a.name <=> b.name } 

虽然小心。如果categories表包含数以千计的记录,这将是一个坏主意。

+0

已经想过它...但我一直在寻找更一般的机制,因为任何东西都应该订购,而不只是类别:( – Fran 2011-01-29 14:29:06