2010-08-29 3 views
13

Globalize2 ile çevrilmiş olan bir alanı kullanarak sorguya çalışıyorum. Sorun şu ki veritabanında ve bir dernekte saklandığından beri çok fazla sorun yaşıyorum.Küreselleşmekte olan dillerden çevrilen bir alana bir sorgu siparişi nasıl verilir

  • Çevirilerin dahil edilmesi ve category_translations.name ile sipariş yapılması çalışmıyor.
  • Bir default_scope denedik ama koşullar için lambda veya bir blok kullanmasına izin vermez çünkü ben tanımlanan with_translations ile denedim
  • ActiveRecord http://gist.github.com/81187 için bu yamayı kullanmadıkça o çalışma alınamıyor globalize2, ancak bununla ilgili bir hata alıyorum ve sipariş vermeden bile çalışamadım.

Ben ettik soru olduğunu

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

    translates :name 
end 

gibi bir şey, ben tercüme adıyla nasıl sipariş edebilirim?

cevap

1

Bunu sqlite3 kullanarak test ettim ve işe yarıyor.

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

Elbette INNER JOIN'e girildiğinde, bu, tüm kategoriler için çevirilerin var olduğunu varsayar. Aksi takdirde biraz tweaks gerekir. – aceofspades

+0

Cevabınız için teşekkür ederiz. Evet, denediğim ilk şey bu, ama sorunumu çözmeyen tüm çeviriler mevcut olmadığından ... – Fran

+0

Bir test vakası için biraz daha fazla zaman geçirdim, bu son sürümü bir daha ver. Umarım yardımcı olur! – aceofspades

1

Ben Category denilen herhangi bir model kayıtların çoğu yüzlerce az değilse de olurdu varsayıyorum. Belki de sonuçları aldıktan sonra bellekte sıralamayı düşünebilirsiniz. Yine de, dikkat edin. categories tablonun binlerce kayıt içerdiği durumlarda bu kötü bir fikir olur. Eğer PostgreSQL kullanıyorsanız

Category.with_translations(I18n.locale).order('category_translations.name') Ayrıca

, sen buna karşılık küçük harfe duyarlı düzeni eklemek isteyebilirsiniz:

Category.with_translations(I18n.locale).order("LOWER(category_translations.name) ASC")

+0

Zaten bunu düşündüm ama ... Daha fazla genel mekanizma bir şey sipariş edilmelidir, sadece Kategori :( – Fran

İlgili konular