2016-04-19 33 views
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

我認爲你必須做的ActiveRecord兩個查詢因爲它基於模型 –

+0

'a','follower_trackings'和'data_trackings'之間的關係類型是什麼? – Uzbekjon

+0

@Uzbekjon'has_many follower_trackings'和'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 trick添加data_trackings.user_id = a.id條件,但它不加入data_trackings,這就是爲什麼必須添加from子句,它基本上執行INNER JOIN。其餘的很簡單,並利用了orderpluck子句不需要指定表名,如果列在表中是唯一的,或者在SELECT中指定的(pluck)。

好了,再次看時,我可能寧願定義範圍檢索數據給定用戶a記錄),將主要用在你的問題,你有原始的SQL。我可能還定義了一個輔助的實例方法,將調用範圍與self,是這樣的:

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

    def tracking_info 
    Model.tracking_info(self) 
    end 
end 

然後一個可以簡單地使用:

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

太棒了。謝謝。顯然它在模型中;) –

相關問題