Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将SQL查询转换为活动记录_Ruby On Rails_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails 将SQL查询转换为活动记录

Ruby on rails 将SQL查询转换为活动记录,ruby-on-rails,ruby-on-rails-5,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

我一直在尝试将以下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链接的报告。

我认为这应该由活动记录范围来处理。让我们把它分解一下

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

我们需要的第二个作用域可以用一个作用域再次构造。这可以通过
User.left\u outer\u连接(:report\u logs)来解决。其中(report\u 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