2009-10-07 5 views
17

findメソッドを使用して、クラスのhas_many関係に基づいて結果を並べ替えることが可能かどうか疑問に思っていました。例えばRails: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 

と私はこのような何かをしたいと思います:

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

はあなたに感謝。

+0

また、関係自体の順序を設定する方法も参照してください。http://stackoverflow.com/questions/1530131/rails-order-using-a-has-many-belongs-to-relationship – Todd

答えて

19

リクエストに関連するテーブルを追加する必要があります。

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

dogs:order文で複数であることに注意してください。レール4に

+2

はDogTagです。 find(:all、:joins =>:dog、:order => 'dogs.name')=) – Staelen

+1

ありがとうございました。私はあなたが知っていると確信していますが、他の誰かのために、その注文はテーブル名でなければならないことがわかりました。すなわち、私はそれをpluarlizeしなければなりませんでした: 'dogs.name'ではなく 'dog.name' – Evan

+0

複数の詳細:) – marimaf

21

このように行われるべきである:

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

または範囲を有する:

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

@result = DogTags.ordered_by_dog_name 

第二のコントローラとしてテストでモックが容易である知っている必要はありませんモデルの詳細。

+0

私は最初に試しましたが、うまくいきませんでした。代わりに、これは動作します: '@result = DogTag.joins(:dog).order( 'name')'。私はPostgreSQLを使用していますが、関連しているかどうかは不明です –

関連する問題