2009-07-02 40 views
8

Rails'de birden çok ActiveRecord nesnesinin sonuçlarını birleştirmenin etkili bir yolu olup olmadığını merak ediyorum. Örneğin, üç bireysel tabloya üç ayrı çağrı yapabilirim ve sonuçların birleştirilmesini ve ortak bir sütunla sıralanmasını istiyorum.ActiveRecord nesneleri nasıl birleştirilir?

İşte umarım anlamak daha kolay soruma yapacak bir süper temel kod örnek:

@results1 = Table1.find(:all) 
@results2 = Table2.find(:all) 
@results3 = Table3.find(:all) 

@combined_results_sorted_by_date_column = (how?) 

başkaları tarafından önerildiği gibi, burada sorunun bir çözüm.

@combined_results = @result1 + @result2 + @result3 
@combined_results.sort! {|x,y| x.date <=> y.date} 

Tarihe göre sıralamak istesem, ancak Tablo3 "created_on" sütununa tarih olarak başvurursa ne olur?

cevap

2

"Tablolar" ile değil, daha çok nesne ile çalışmıyorsunuz. Bu konuda bu şekilde düşünürsek

, bu hiçbir anlamı olması kılacak:

@results1 = Users.find(:all) 
@results2 = Posts.find(:all) 
@results3 = Comments.find(:all) 

ne olmuş "kombine" formu anlamına gelir ki?

Muhtemelen, farklı "sorgular" kullanarak sonuçları aynı türden birleştirmek isteyebilirsiniz. Bu mu? Bu kesinlikle dünyadaki en verimli kod olamaz iken

+0

Bir sorun yönetimindeki bir zaman çizelgesi için bir kullanıcı hesabına, birleştirilmiş yorumlara, durumlara ve işlemlere sahibim. – dangerousdave

+0

Bu durumda, hepsinin belirli bir arabirime yanıt vermesi veya birine eşlenmenin bir yolu olması gerekir. Temel nokta, "veritabanı tabloları" açısından düşünmenin sizi zayıf tasarımlara yönlendireceğidir. Farklı yerlerdeki verileri kullanmamanı ima etmeye çalışmıyorum, sadece bu konuya nasıl yaklaştığınızı/düşündüğünüzü sorguluyorsunuz. –

0
@combined_results = @result1 + @result2 + @result3 
@combined_results.sort! {|x,y| x.date <=> y.date} 

, sadece neye ihtiyacınız olabilir.

Bazı modellerde bir tarih yöntemi yoksa, bir tane oluşturmanızı öneririm. Bu kadar kolay.

def date 
    created_on 
end 
0
@results1 = Table1.find(:all) 
@results2 = Table2.find(:all) 
@results3 = Table3.find(:all) 

combined = (@results1 + @results2 + @results3).sort { |x, y| x.date <=> y.date } 
+0

Tarihe göre sıralamak istiyorum, ancak Tablo3, "created_on" sütunu tarih olarak mı gösterir? Çok teşekkürler! – Jess

+0

Bunu "created_on" değerini döndüren bir "date()" yöntemini Tablo3'e ekleyerek çözebilirsiniz. – Ethan

14
@results1 = Table1.find(:all) 
@results2 = Table2.find(:all) 
@results3 = Table3.find(:all) 

@combined_results_sorted_by_date_column = 
    (@results1 + @results2 + @results3).sort_by(&:date) 

Ne tarihe göre sıralamak istiyorsanız, ancak Tablo3 tarihi olarak "created_on" sütununa işaret ederse?

class Table3 
    alias_method :date, :created_on 
end 

veya basitçe

class Table3 
    alias date created_on 
end 
0

Ben senin veri hacimleri gibi ne olduğunu emin değilim ama sıralama söz konusu olduğunda, veritabanı Hiç "seçeneğini kullanarak edecek daha bunun daha iyi bir iş yapacak uygulama katmanı.

Üç tabloyu üç farklı model sınıfı karışık bir dizi oluşturacak şekilde gören bir dizi model nesnesi olarak döndürülen verilere mi ihtiyacınız var?

Doğrudan SQL satırları ve sütunları döndüren ve DB verileri ayıklamak için tüm zor işleri neden kullanamazsınız?

1

Muhtemelen bu yanıtı beğenmeyeceksiniz, ancak veritabanı şemanızı gözden geçirmek isteyebileceğinizi söyleyebilirim. Benzer bir durumdaydım ve sonuçları birleştirdikten sonra sıralamak kesinlikle gitmek istediğiniz yol değildir.

+1

Sana inanıyorum, ama durumu nasıl ele aldığın konusunda daha spesifik olabilir misin? – iterion

0

Bir çeşit tarihe göre sıralanan üç farklı türde ActiveRecord nesnesi istediğinizi varsayıyorum.

@array = (Bucket.all + Mop.all + Detergent.all).sort{|x,y| x.sort_by <==> y.sort_by} 

sort_by alanınız her bir nesne türü için farklı olduğundan, onu tanımlamanız gerekir.

class Bucket < ActiverRecord::Base 
    def sort_by 
    cleaned_on 
    end 
end 

class Detergent < ActiverRecord::Base 
    def sort_by 
    purchased_on 
    end 
end 

Sen UNION kullanarak tek sorguda sıralanan tüm veri seçip, ancak bunun dışında AR nesneleri elde değildir.