尝试重构 Rails 4.2 范围

Trying to refactor Rails 4.2 scope

我已经更新了这个问题

我在 RAILS 4 应用程序中有以下 SQL 范围,它可以工作,但有几个问题。

1) 它真的是 RAW SQL 而不是 rails 方式 2) 字符串插值打开风险 SQL 注入

这是我的:

scope :not_complete -> (user_id) { joins("WHERE id NOT IN 
(SELECT modyule_id FROM completions WHERE user_id = #{user_id})")}

关系是多对多的,使用称为完成的联接 table 来匹配用户和模块之间关系的 id。

任何帮助制作这个 Rails(y) 以及如何设置它以在没有风险的情况下接受 user_id 的 arg,所以我可以这样称呼它:

Modyule.not_complete("1")

谢谢!

你应该添加一些关于模型及其关联的信息,无论如何这是我的试用,可能有一些错误,因为我不知道关联是一对多还是多对多。

scope :not_complete, lambda do |user_id|
  joins(:completion).where.not(   # or :completions ?
    id: Completion.where(user_id: user_id).pluck(modyule_id)
  )
end

PS: 为了方便阅读,我把它变成了多行,如果你喜欢,你可以把它改回单行。