2010-08-29 75 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