在Rails 3中为find_by_id添加附加条件

时间:2013-02-08 08:00:55

标签: ruby-on-rails ruby-on-rails-3

我在Mac上使用Rails 3.2.11

我有这句话可以正常工作:

object= Object.find_by_id(params[:id])

我正在尝试为该陈述添加一个条件,所以我这样做了:

object = Object.where("id = :id AND level <= :level",{:id => params[:id], :level =>     current_user.level})

这种方法会有风险吗?任何替代方案?

3 个答案:

答案 0 :(得分:1)

如果ActiveRecord继续维持消毒输入合同,则此声明不存在风险。另一种选择是范围,但实际上只是用不同的语法做同样的事情。

您可以执行set a default scope定义level限制,然后您可以执行标准find_by_id。但如果这是不合需要的,只需正确使用语法:

Object.where(id: params[:id], level: current_user.level)

答案 1 :(得分:0)

没有风险,但定义方式不容易理解。

简单的陈述将起作用:

object = Object.where("id = ? AND level <= ?",{params[:id],   current_user.level})

答案 2 :(得分:0)

只要你让rails处理你的值的消毒,你就没有问题。我的意思是使用像

这样的用户输入从rails运行sql命令
Object.where("id = #{params[:id]} AND level <= #{current_user.level}")

将容易受到sql注入