2016-04-23 20 views
2

私はUserモデルを持っているとしましょう。ユーザーにはhas_manyという2つの関連付けがあります。つまり、ユーザーは多くの鉛筆を持ち、多くの車を所有しています。 Cars and Pencilsテーブルには、同じ属性、:date、およびspeed(car)と:length(pencil)のようなものがあります。私は配列/リレーション[:日付、:スピード、:長さ]を持つように、ユーザーの鉛筆と車の一般的な属性:日付に参加したい。どのように達成するには、私は結合を試み、マージしますが、彼らは役に立たなかった。共通の属性に2つのActiveRecordアソシエーションを結合する

答えて

1

私は間違いなく、効率のために、クエリではなく、ループにこれを取得お勧めします。

Car.joins(:user => :pencils).where("pencils.date = cars.date") 

をそして、あなたはすぐに、配列にそれを減らしたい場合:私は、これが機能すると思います

Car.joins(:user => :pencils).where("pencils.date = cars.date").pluck("cars.date", "cars.speed", "pencils.length") 

あなたはdatenilで試合を含める必要がある場合は、追加する必要があります

Car.joins(:user => :pencils).where("(pencils.date = cars.date) OR (pencils.date IS NULL AND cars.date IS NULL)") 
1

多くのより効率的な選択肢が存在するが、ここでは一つの可能​​なアプローチは次のとおりです。

class User < ActiveRecord::Base 
    def get_merged_array 
    dates = (cars.map(&:date) & pencils.map(&:date)) 
    results = [] 
    dates.each do |date| 
     cars.where(date: date).each do |car| 
     pencils.where(date: date).each do |pencil| 
      results << [date, car.speed, pencil.length] 
     end 
     end 
    end 
    results 
    end 
end 
+0

これは素晴らしい解決策であるように見えますが、試してみてください。もう一つの質問です。もし私が完全な外部の参加をしたいのであれば、私は車と鉛筆を取得したいと思います。 –

関連する問題