Ruby on rails 将SQL查询转换为活动记录
我一直在尝试将以下SQL查询转换为ActiveRecord查询,但没有成功: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
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