2016-04-19 7 views
1

データ分析のためには、両方の結果を1つのセットにする必要があります。代わりに、アレイを醜い、マージのこのクエリをActiveRecordに書くことはできますか?

a.follower_trackings.pluck(:date, :new_followers, :deleted_followers) 
a.data_trackings.pluck(:date, :followed_by_count) 

(それらは異なる開始日付を持つことができると私はOBV。日付が両方の配列に存在する値のみを必要とする)私はこれはMySQLの

SELECT 
    followers.new_followers, 
    followers.deleted_followers, 
    trackings.date, 
    trackings.followed_by_count 
FROM 
    instagram_user_follower_trackings AS followers, 
    instagram_data_trackings AS trackings 
WHERE 
    followers.date = trackings.date 
    AND 
    followers.user_id=5 
    AND 
    trackings.user_id=5 
ORDER 
    BY trackings.date DESC 

について考えうまく動作しますが、私はActiveRecordで同じことを書くことができるのだろうか?

+0

を:

def Model scope :tracking_info, ->(user) { ... } def tracking_info Model.tracking_info(self) end end 

そしてあるが、単純に使用することができます。私はまたのようなもの、selfとスコープを呼ぶようなヘルパーインスタンスメソッドを定義できますそれはモデルに基づいているから –

+0

'a'、' follower_trackings'と 'data_trackings'の間の関係型は何ですか? – Uzbekjon

+0

@Uzbekjon 'a has_many follower_trackings'と' a has_many data_trackings'です。追跡は「a」 –

答えて

1

あなたの生のSQLと同じクエリをレンダリングする必要があり、次の操作を行うことができますが、それはまた、非常に醜いです...:スコープで遊んでいる間いくつかのトリックが便利判明あり

a.follower_trackings. 
    merge(a.data_trackings). 
    from("instagram_user_follower_trackings, instagram_data_trackings"). 
    where("instagram_user_follower_trackings.date = instagram_data_trackings.date"). 
    order(:date => :desc). 
    pluck("instagram_data_trackings.date", 
     :new_followers, :deleted_followers, :followed_by_count) 

merge trickdata_trackings.user_id = a.id条件を追加しますが、data_trackingsに参加しないため、from句を追加する必要があります。これは本質的にINNER JOINを実行します。残りはかなり簡単で、列がテーブル間で一意である場合、またはSELECT(pluck)で指定されている場合は、orderおよびpluck句ではテーブル名を指定する必要はありません。もう一度見るとき

まあ、私はおそらく、むしろ本質的にあなたの質問ではあなたが持っている生のSQLを使用することになり、特定のユーザー(a記録)のデータを取得するため範囲を定義します。私はあなたがActiveRecordを持つ2つのクエリを行う必要があると思う

a = Model.find(1) 
a.tracking_info 
# => [[...], [...]]  
+0

素晴らしいありがとう。明らかにそれはモデルの中にあります;) –

関連する問題