2010-09-17 3 views
0

J'ai deux modèles:Comment trier les résultats ActiveRecord en utilisant un attribut dans la superclasse?

class Manufacturer < ActiveRecord::Base 
    has_many :models 
end 

class Model < ActiveRecord::Base 
    belongs_to :manufacturer 
    belongs_to :model 
end 

Ce que je veux être en mesure de faire est de trouver tous les fabricants dont les modèles appartiennent à une catégorie donnée:

manufacturers = Model.find(:all, :conditions=>["vehicle_category_id = 1"], :include => :manufacturer, :group => "manufacturer_id").map {|model| model.manufacturer } 

Mais je veux être en mesure d'ordonner la résultats par nom de fabricant ie fabricant.nom

Savez-vous comment je peux faire cela?

MISE À JOUR:

Cela fonctionne pour moi, mais semble très inefficace, doit être une meilleure façon:

manufacturers = (Model.find(:all, :conditions=>["vehicle_category_id = 1"], :include => :manufacturer, :group => "manufacturer_id").map {|model| model.manufacturer }).compact.sort{|x,y| x.name <=> y.name} 

Répondre

0

Solution 1

Manufacturer.all(
    :condition => [ "EXISTS (
        SELECT a.id 
        FROM models a 
        WHERE a.manufacturer_id  = manufacturers.id AND 
          a.vehicle_category_id = ? 
        )", 
        1 
       ], 
    :order  => "manufacturers.name" 
) 

Solution 2

Manufacturer.all(
    :select => "DISTINCT manufacturers.*", 
    :joins  => :models, 
    :condition => [ "models.vehicle_category_id = ?", 1], 
    :order  => "manufacturers.name" 
) 
  • Solution 2 est utilise des constructions rails.

  • Solution 1 est plus rapide que la solution 2.

Questions connexes