将SQL查询转换为活动记录

时间:2017-09-29 21:03:23

标签: ruby-on-rails ruby-on-rails-5

我一直试图将以下SQL查询转换为ActiveRecord之一,但没有成功:

SELECT invited.id
FROM (
    SELECT users.id 
    FROM users 
    WHERE users.invited_by_id IS NOT NULL 
) AS invited
JOIN (
    SELECT id 
    FROM users 
    WHERE users.id NOT IN ( 
        SELECT user_id 
        FROM report_logs
    ) 
) AS no_report ON invited.id = no_report.id;

我一直在使用以下命令,但它没有返回与SQL版本相同的结果。

@users = User.includes(:report_logs)
         .on(report_logs: { user_id: nil })
         .where("invited_by_id IS NOT NULL")

查询的要求是查找已被其他用户邀请并且没有链接到其ID 的报告的所有用户。

1 个答案:

答案 0 :(得分:1)

我认为这应该由活动记录范围来处理。让我们打破这一点

首先,我们需要一个范围来查找被邀请的用户。这可以通过此范围User.where.not(invited_by_id: nil)来解决。

我们需要的第二个范围可以用范围再次构建。这可以通过User.left_outer_joins(:report_logs).where( report_logs: { id: nil } )

解决

现在我们可以将这些作为命名范围保存在我们的模型中以方便使用。

class User
  has_many :report_logs
  scope :invited, -> { where.not(invited_by_id: nil) }
  scope :without_report_logs, -> { left_outer_joins(:report_logs).where( report_logs: { id: nil } ) }
end

User.invited.without_report_logs