2009-10-07 29 views
17

Tôi đã tự hỏi liệu có thể sử dụng phương thức tìm kiếm để sắp xếp các kết quả dựa trên mối quan hệ has_many của lớp với một lớp khác hay không. ví dụ.Đường ray: thứ tự sử dụng mối quan hệ has_many/owned_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 

và tôi muốn làm một cái gì đó như thế này:

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

cảm ơn bạn.

+0

cũng xem cách chỉ đặt thứ tự trên mối quan hệ: http://stackoverflow.com/questions/1530131/rails-order-using-a-has-many-belongs-to-relationship – Todd

Trả lời

19

Bạn cần tham gia bảng liên quan theo yêu cầu.

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

Lưu ý rằng dogs là số nhiều trong báo cáo :order.

+2

phải là DogTag. find (: all,: joins =>: dog,: order => 'dogs.name') =) – Staelen

+1

Cảm ơn bạn đã giải pháp. Tôi chắc chắn rằng bạn biết, nhưng đối với bất cứ ai khác, tôi thấy rằng thứ tự phải là tên bảng là tốt, tức là tôi đã phải pluarlize nó: 'dogs.name' không 'dog.name' – Evan

+0

Cảm ơn bạn đã chỉ ra chi tiết số nhiều :) – marimaf

21

Trong Rails 4 nó nên được thực hiện theo cách này:

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

hoặc với phạm vi:

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

@result = DogTags.ordered_by_dog_name 

Thứ hai là dễ dàng hơn để nhạo báng trong các thử nghiệm như điều khiển không cần phải biết về chi tiết mô hình.

+0

Tôi đã thử đầu tiên nhưng nó không hoạt động. Thay vào đó nó hoạt động: '@result = DogTag.joins (: dog) .order ('name')'. Tôi đang sử dụng PostgreSQL, không chắc liệu nó có liên quan không –

Các vấn đề liên quan