2009-10-07 148 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 2016-01-13 18:20:02

回答

19

您需要將相關表格加入請求。

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

注意dogs:order聲明覆數。

+2

應該是DogTag。 find(:all,:joins =>:dog,:order =>'dogs.name')=) – Staelen 2009-10-07 08:00:14

+1

謝謝你的解決方案。我相信你知道,但對於其他人,我發現訂單也必須是表格名稱,也就是說,我必須對其進行多語言化:'dogs.name'而不是'dog.name' – Evan 2009-10-07 08:00:54

+0

感謝您指出複數詳細:) – marimaf 2012-05-06 22:00:17

21

在Rails 4它應該做的事是這樣的:

@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,不確定它是否相關 – 2016-03-20 03:03:56