Rails: порядок с использованием отношения has_many / belongs_to

17

Мне было интересно, можно ли использовать метод find для упорядочения результатов на основе отношения has_many класса к другому классу. например.

# 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)

спасибо.

    
задан Evan 07.10.2009 в 09:44
источник
  • см. также, как просто установить порядок в самой связи: stackoverflow.com/questions/1530131/... –  Todd 13.01.2016 в 19:20

2 ответа

20

Вам нужно присоединиться к связанной таблице с запросом.

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

Обратите внимание, что dogs является множественным числом в выражении :order .

    
ответ дан Damien MATHIEU 07.10.2009 в 09:48
источник
  • должен быть DogTag.find (: all,: joins =>: dog,: order => 'dogs.name') =) –  Staelen 07.10.2009 в 10:00
  • Спасибо за решение. Я уверен, что вы знаете, но для кого-то еще я обнаружил, что заказ должен быть также именем таблицы, т. Е. Мне пришлось его плуторить: «dogs.name» not «dog.name» –  Evan 07.10.2009 в 10:00
  • Спасибо за указание на множественную деталь :) –  marimaf 07.05.2012 в 00:00
  • DogTab.where (...). joins (: dog) .order ('dogs.name') да! Благодаря ! –  Simon Franzen 25.04.2018 в 15:40
22

В 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

Во-вторых, легче промахиваться в тестах, поскольку контроллеру не нужно знать подробности модели.

    
ответ дан gertas 03.04.2014 в 22:42
источник
  • Я пробовал первый, но он не работал. Вместо этого это работает: @result = DogTag.joins (: dog) .order ('name'). Я использую PostgreSQL, не уверен, что это связано –  Junchao Gu 20.03.2016 в 04:03