2009-10-07 30 views
17

Bir sınıfın başka bir sınıfla olan has_many ilişkisine dayalı sonuçları sıralamak için bulma yöntemini kullanmanın mümkün olup olmadığını merak ediyordum. Örneğin.Raylar: bir has_many/belongs_to ilişkisini kullanarak sırala

# 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 

ve ben böyle bir şey yapmak istiyorum:

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

teşekkür ederim.

+0

Ayrıca, ilişkiyi kendiniz nasıl ayarlayacağınıza da bakın: http://stackoverflow.com/questions/1530131/rails-order-using-a-has-many-belongs-to-relationship – Todd

cevap

19

İlgili tabloya istek üzerine katılmanız gerekir. dogs:order açıklamada çoğul olduğunu

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

Not. Raylar 4'te

+2

DogTag olmalıdır. find (: all,: joins =>: köpek,: order => 'dogs.name') =) – Staelen

+1

Çözüm için teşekkür ederiz. Eminim biliyorsunuzdur, ama başkası için, siparişin tablo adı da olması gerektiğini buldum, yani onu çoğaltmak zorunda kaldım: 'dog.name' not 'dog.name' – Evan

+0

İşaretlediğiniz için teşekkürler çoğul detay :) – marimaf

21

bu şekilde yapılmalıdır:

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

veya kapsamı ile

:

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

@result = DogTags.ordered_by_dog_name 

ikinci kontrolör hakkında bilmek zorunda olmadığı için testlerde dalga geçmek daha kolaydır model detayları.

+0

İlk denedim ama işe yaramadı. Bunun yerine şu işler: '@result = DogTag.joins (: köpek) .order ('name')'. PostgreSQL kullanıyorum, ilgili olup olmadığından emin değilim –