Evan
Evan

Reputation: 1326

Rails: order using a has_many/belongs_to relationship

I was wondering if it was possible to use the find method to order the results based on a class's has_many relationship with another class. e.g.

# 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

and I would like to do something like this:

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

thank you.

Upvotes: 17

Views: 13171

Answers (2)

gertas
gertas

Reputation: 17145

In Rails 4 it should be done this way:

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

or with scope:

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

@result = DogTags.ordered_by_dog_name

The second is easier to mock in tests as controller doesn't have to know about model details.

Upvotes: 24

Damien MATHIEU
Damien MATHIEU

Reputation: 32629

You need to join the related table to the request.

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

Note that dogs is plural in the :order statement.

Upvotes: 20

Related Questions