我想从请求中获取参数,即:model
和scope
然后,我想去取:
eval("#{params[:model]}.#{params[:scope]}")
但是......如果在范围内传递了delete_all
,我就会受到威胁......所以我想测试scope
是否真的是一个范围。
任何执行此操作的方法? (我正在使用Rails3)
答案 0 :(得分:2)
这并不能真正回答您的问题,但如果无法确定方法是否为范围,则可能仍然有用:
您可以检查生成的SQL
eval("#{params[:model]}.#{params[:scope]}.to_sql")
并检查危险的SQL调用(DELETE,TRUNCATE,UPDATE,INSERT)。
编辑:
您还可以检查您在模型上调用的作用域是在此模型中定义的,而不是在ActiveRecord :: Base等父类中定义。
model.method(scope.to_sym).owner == model
编辑2:
您还可以在空记录集上调用范围,并检查结果的类。对于范围,它将是ActiveRecord :: Relation,但对于delete_all,它将是Fixnum:
model.where('0').scope.class == ActiveRecord::Relation