2010-08-29 11 views
13

Estoy tratando de ordenar una consulta utilizando un campo que se traduce con globalize2. El problema es que desde que estoy almacenado en una base de datos y en una asociación, tengo muchos problemas.Cómo ordenar una consulta por un campo traducido utilizando globalizar

  • Hacer una inclusión de las traducciones y ordenar por category_translations.name no funciona.
  • He intentado un default_scope pero ya que no permite utilizar lambda o un bloque para las condiciones no puedo conseguir que funcione a menos que utilice este parche para ActiveRecord http://gist.github.com/81187
  • He tratado con el with_translations se define en globalize2, sin embargo me sale un error con esto y no pude hacerlo funcionar incluso sin pedirlo.

tengo algo por el estilo

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

    translates :name 
end 

La pregunta es, ¿cómo puedo hacer el pedido por el nombre traducido?

Respuesta

1

He probado esto usando sqlite3, y funciona.

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

Por supuesto, sea Al utilizar INNER JOIN, se supone que existen traducciones para todas las categorías. Si no, necesitará algunos ajustes. – aceofspades

+0

Gracias por su respuesta. Sí, eso es lo primero que intenté, pero como no todas las traducciones existen que no resolvieron mi problema ... – Fran

+0

Tuve un poco más de tiempo para un caso de prueba, dale una oportunidad a esta última versión. ¡Espero eso ayude! – aceofspades

1

estoy asumiendo que cualquier modelo llamado Category tendría en la mayoría de los cientos de registros si no menos. Tal vez pueda considerar ordenar los resultados en memoria, después de buscarlos.

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

Sin embargo, Aviso. Esto se convertiría en una mala idea si la tabla categories contiene más de miles de registros.

+0

Ya lo pensé ... pero estaba buscando un Mecanismo más general ya que todo debe ser ordenado, no solo Categoría :( – Fran

Cuestiones relacionadas