2009-10-07 3 views
17

Мне было интересно, можно ли использовать метод find для заказа результатов на основе отношений has_many класса с другим классом. напримерРельсы: заказ с использованием отношения 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 заявлении.

+2

должен быть DogTag. find (: all,: joins =>: dog,: order => 'dogs.name') =) – Staelen

+1

Благодарим за решение. Я уверен, что вы знаете, но для кого-то еще я обнаружил, что заказ должен быть также именем таблицы, т. Е. Мне пришлось его плуоризировать: «dogs.name» not «dog.name» – Evan

+0

Спасибо, что указали plural detail :) – marimaf

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, не уверен, что это связано –

Смежные вопросы