我可以在ActiveRecord中编写此查询

时间:2016-04-19 18:12:17

标签: ruby-on-rails ruby-on-rails-4 activerecord

对于数据分析我需要将两个结果合并为一组。

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

而不是丑陋合并一个数组(它们可以有不同的开始日期,而且我们只需要两个数组中存在日期的那些值)我想到了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编写相同的内容?

1 个答案:

答案 0 :(得分: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,这就是{{1}的原因必须添加子句,它基本上执行INNER JOIN。其余的非常简单,并且利用fromorder子句不需要指定表名的事实,如果列在表中是唯一的,或者在SELECT中指定({{ 1}})。

好吧,再次查看时,我可能宁愿定义一个范围来检索给定用户的数据pluck记录),该记录本质上会使用您在题。我也可以定义一个帮助器实例方法,用pluck调用范围,如:

a

然后可以简单地使用:

self