2009-10-07 6 views
17

Ich frage mich, ob es möglich war, die find-Methode zu verwenden, um die Ergebnisse basierend auf einer Klasse has_many Beziehung mit einer anderen Klasse zu ordnen. z.B.Rails: Auftrag mit einer Beziehung has_many/gehört zu

# 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 

und ich möchte so etwas tun:

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

Ihnen danken.

+0

siehe auch, wie Sie nur die Reihenfolge der Beziehung selbst festlegen: http://stackoverflow.com/questions/1530131/rails-order-using-a-has-many-belongs-to-relationship – Todd

Antwort

19

Sie müssen die zugehörige Tabelle mit der Anfrage verknüpfen.

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

Beachten Sie, dass dogs in der :order Aussage Plural ist.

+2

sollte DogTag sein. find (: alle,: joins =>: hund,: order => 'hunde.name') =) – Staelen

+1

Danke für die Lösung. Ich bin mir sicher, dass Sie wissen, aber für jeden anderen fand ich, dass die Reihenfolge auch der Tabellenname sein musste, dh ich musste es plualisieren: 'dogs.name' nicht 'dog.name' – Evan

+0

Danke für das Aufzeigen der Plural Detail :) – marimaf

21

In Rails 4 sollte diese Art und Weise erfolgen:

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

oder mit -umfang:

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

@result = DogTags.ordered_by_dog_name 

Die zweite ist einfacher in Tests zu verspotten als Controller nicht wissen, haben über Modelldetails.

+0

Ich versuchte das erste, aber es hat nicht funktioniert. Stattdessen funktioniert das: '@result = DogTag.joins (: dog) .order ('name')'. Ich benutze PostgreSQL, nicht sicher, ob es verwandt ist –

Verwandte Themen