我一直试图将以下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 的报告的所有用户。
答案 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