【发布时间】:2011-02-13 15:41:24
【问题描述】:
我想从请求中获取参数,即:model 和 scope
然后,我想获取:
eval("#{params[:model]}.#{params[:scope]}")
但是...如果delete_all 在范围内传递,我会受到威胁...所以我想测试scope 是否真的是一个范围。
有什么方法可以做到吗? (我使用的是 Rails3)
【问题讨论】:
标签: ruby-on-rails scope
我想从请求中获取参数,即:model 和 scope
然后,我想获取:
eval("#{params[:model]}.#{params[:scope]}")
但是...如果delete_all 在范围内传递,我会受到威胁...所以我想测试scope 是否真的是一个范围。
有什么方法可以做到吗? (我使用的是 Rails3)
【问题讨论】:
标签: ruby-on-rails scope
这并不能真正回答您的问题,但如果无法确定方法是否为范围,则可能仍然有用:
您可以检查生成的 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
【讨论】: