2009-07-02 23 views
8

Railsで複数のActiveRecordオブジェクトの結果を組み合わせる効率的な方法があるのだろうかと思います。たとえば、3つの個別のテーブルに3回の呼び出しを行い、結果を結合して共通の列でソートしたいとします。ActiveRecordオブジェクトを結合する方法は?

はここでうまくいけば理解しやすい私の質問を行いますスーパー基本的なコードの例です:

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

@combined_results_sorted_by_date_column = (how?) 

他の人が示唆したように、ここでの問題に対する1つの解決策です。

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

日付でソートする場合はどうすればよいですか?テーブル3は日付として「created_on」列を参照していますか?

答えて

2

あなたは「テーブル」のではなく、オブジェクトでは動作しません。

あなたはそれについてこのように考えた場合、それが持っている意味をなさないだろう:それの「組み合わせ」フォームが意味でしょう

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

何?あなたはおそらく欲しい

は異なる「クエリ」を使用して同じ種類からの結果を組み合わせることです。 それは?

+0

私は、問題管理アプリケーションでタイムラインのコメント、ステータス、コミットを組み合わせて使用​​しています。 – dangerousdave

+0

この場合、それらはすべて特定のインターフェイスに応答するか、または1つのインターフェイスにマップする方法が必要です。要点は、データベーステーブルの観点から考えると、あなたを貧しいデザインに導くことです。私はあなたが別の場所からのデータを使用しないことを暗示しようとしていませんでした。ちょうどあなたがそれにどのようにアプローチ/考えているか質問しています。 –

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

これは確かに世界で最も効率的なコードではありませんが、必要なものかもしれません。一部のモデルは、日付のメソッドを持っていない場合は

私はあなたのものを作成することをおすすめします。 それは簡単です。

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

日付でソートしたいのですが、Table3は日付として "created_on"列を参照していますか?本当にありがとう! – Jess

+0

"created_on"の値を返すTable3に "date()"メソッドを追加することで、それを解決できます。 – 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) 

私は、日付でソートしたいのですが、表3は、日付として「CREATED_ON」欄を参照している場合?

class Table3 
    alias_method :date, :created_on 
end 

または単に

class Table3 
    alias date created_on 
end 
0

「私はあなたのデータボリュームが似ているかわからないんだけど、それはソートに来るとき、あなたのデータベースはあなたが使用しますよりも、それをより良い仕事をしますアプリケーション層 "コードを含む。

あなたはおそらく3つの異なるモデルクラスの混同配列を生成します3つの表のように見てモデルオブジェクトの配列として返されたデータが必要ですか?

なぜ、行と列を返す直接-SQLを使用してDBにデータをソートするすべてのハードワークを行う必要はありませ?

1

おそらく、この答えを好きでするつもりはないが、私はあなたのデータベーススキーマを修正することをお勧めしますと言うでしょう。私は同様の状況にあり、それらを連結した後に結果を並べ替えることは、あなたが行きたいと思う方法ではありません。

+1

私はあなたを信じていますが、状況をどのように扱ったのか、より具体的になるでしょうか? – iterion

0

私はActiveRecordオブジェクトの3つの異なるタイプの混合配列を、ある種の日付でソートしたいと仮定しています。

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

sort_byフィールドはオブジェクトタイプごとに異なるので、定義する必要があります。

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

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

あなたはUNIONを使用して単一のクエリでソートされたすべてのデータをプル可能性がありますが、そのうちのARオブジェクトを取得しません。

関連する問題