2010-08-29 14 views
13

J'essaye de commander une requête en utilisant un champ qui est traduit avec globalize2. Le problème est que depuis stocké dans la base de données et dans une association, j'ai beaucoup de problèmes.Comment commander une requête par champ traduit en utilisant globaliser

  • Le fait de faire une inclusion des traductions et de les classer par category_translations.name ne fonctionne pas.
  • J'ai essayé default_scope mais puisqu'elle ne permet pas d'utiliser lambda ou un bloc pour les conditions je ne peux pas le faire fonctionner à moins d'utiliser ce patch pour ActiveRecord http://gist.github.com/81187
  • J'ai essayé avec le with_translations défini dans globalize2, cependant je reçois une erreur avec ceci et je ne pouvais pas le faire fonctionner même sans commander.

J'ai quelque chose comme ça

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

    translates :name 
end 

La question est, comment puis-je commander par le nom traduit?

Répondre

1

J'ai testé cela en utilisant sqlite3, et cela fonctionne.

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

Bien sûr être Dans un INNER JOIN, ceci suppose que les traductions existent pour toutes les catégories. Sinon, il faudra quelques ajustements. – aceofspades

+0

Merci pour votre réponse. Oui, c'est la première chose que j'ai essayée, mais comme toutes les traductions n'existent pas, cela n'a pas résolu mon problème ... – Fran

+0

Si vous aviez un peu plus de temps pour un test, essayez cette dernière version. J'espère que cela aide! – aceofspades

1

Je suppose que tout modèle appelé Category aurait à la plupart des centaines de dossiers sinon moins. Peut-être que vous pouvez envisager de trier les résultats en mémoire, après les avoir récupérés.

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

Attention cependant. Cela deviendrait une mauvaise idée si la table categories contient plus de milliers d'enregistrements.

+0

Déjà pensé à ce sujet ... mais je cherchais un mécanisme plus général puisque tout devrait être commandé, pas seulement Catégorie :( – Fran