2009-10-07 27 views
17

Mi chiedevo se fosse possibile utilizzare il metodo find per ordinare i risultati in base alla relazione has_many di una classe con un'altra classe. per esempio.Rails: ordinare utilizzando una relazione 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 

e mi piacerebbe fare qualcosa di simile:

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

grazie.

+0

vedere anche come impostare semplicemente l'ordine sulla relazione stessa: http://stackoverflow.com/questions/1530131/rails-order-using-a-has-many-belongs-to-relationship – Todd

risposta

19

È necessario unirsi alla tabella correlata alla richiesta.

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

noti che dogs è plurale nella dichiarazione :order.

+2

dovrebbe essere DogTag. find (: all,: joins =>: dog,: order => 'dogs.name') =) – Staelen

+1

Grazie per la soluzione. Sono sicuro che lo sai, ma per chiunque altro ho scoperto che l'ordine doveva essere anche il nome del tavolo, cioè dovevo contenerlo: "dogs.name" non "dog.name" – Evan

+0

Grazie per aver sottolineato plurale detail :) – marimaf

21

In rotaie 4 dovrebbe essere fatto in questo modo:

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

o con portata:

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

@result = DogTags.ordered_by_dog_name 

Il secondo è più facile da mock test come controllore non deve conoscere dettagli del modello.

+0

Ho provato il primo ma non ha funzionato. Invece funziona: '@result = DogTag.joins (: dog) .order ('name')'. Sto usando PostgreSQL, non sono sicuro che sia correlato –

Problemi correlati