试图重构Rails 4.2范围

时间:2015-04-21 16:16:00

标签: sql many-to-many ruby-on-rails-4.2 scopes

我已更新此问题

我在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})")}

关系是多对多的,使用名为completions的连接表来匹配用户和modyules之间关系的id。

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

Modyule.not_complete("1")

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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:为了便于阅读,我将其转换为多行,如果您愿意,可以将其更改为oneline。