尝试重构 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: 为了方便阅读,我把它变成了多行,如果你喜欢,你可以把它改回单行。
我已经更新了这个问题
我在 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: 为了方便阅读,我把它变成了多行,如果你喜欢,你可以把它改回单行。