2009-10-07 9 views
17

Je me demandais s'il était possible d'utiliser la méthode find pour classer les résultats en fonction de la relation has_many d'une classe avec une autre classe. par exemple.Rails: ordre utilisant une relation has_many/belongs_to

# has the columns id, name 
class Dog < ActiveRecord::Base 
    has_many :dog_tags 
end 

# has the columns id, color, dog_id 
class DogTags < ActiveRecord::Base 
    belongs_to :dog 
end 

et je voudrais faire quelque chose comme ceci:

@result = DogTag.find(:all, :order => dog.name) 

merci.

+0

voir également comment simplement définir l'ordre sur la relation elle-même: http://stackoverflow.com/questions/1530131/rails-order-using-a-has-many-belongs-to-relationship – Todd

Répondre

19

Vous devez joindre la table associée à la demande.

@result = DogTag.find(:all, :joins => :dog, :order => 'dogs.name') 

Notez que dogs est pluriel dans la déclaration :order.

+2

devrait être DogTag. find (: all,: joins =>: dog,: order => 'dogs.name') =) – Staelen

+1

Merci pour la solution. Je suis sûr que vous le savez, mais pour quelqu'un d'autre, j'ai trouvé que l'ordre devait aussi être le nom de la table, c'est-à-dire que je devais le plumer: 'dogs.name' pas 'dog.name' – Evan

+0

Merci d'avoir signalé détail au détail :) – marimaf

21

Dans Rails 4, il devrait se faire de cette façon:

@result = DogTag.joins(:dog).order('dogs.name') 

ou portée:

class DogTags < ActiveRecord::Base 
    belongs_to :dog 
    scope :ordered_by_dog_name, -> { joins(:dog).order('dogs.name') } 
end 

@result = DogTags.ordered_by_dog_name 

Le second est plus facile de se moquer dans les tests en tant que contrôleur ne savoir pas détails du modèle.

+0

J'ai essayé le premier mais ça n'a pas marché. Au lieu de cela cela fonctionne: '@result = DogTag.joins (: dog) .order ('nom')'. J'utilise PostgreSQL, je ne sais pas si c'est lié –

Questions connexes