如何使用字符串调用名为scope的活动记录

时间:2012-11-09 22:38:18

标签: ruby-on-rails ruby activerecord

我确信我很想理解使用电话,但我想我可以做这样的事情。

@case_studies = CaseStudy.call("some_named_scope")

其中"some_named_scope"也是CaseStudy中的命名范围。我需要使用调用的原因是因为我已经命名了与控制器中的操作名称相同的范围,因此我正在跳这样做。

@case_studies = CaseStudy.call(params[:action])

修改

原谅我,我刚刚意识到我正在考虑发送方法,一些单词调用如何卡在我脑海中。但是@case_studies = CaseStudy.send(params[:action])按照我的想法运作。

4 个答案:

答案 0 :(得分:6)

虽然@kolrie有正确答案,但根本不安全。

应按如下方式列入白名单:

scope = ["first_scope", "second_scope", "default_scope"].include? params[:action] ? params[:scope] : "default_scope"
@case_studies = CaseStudy.send(scope)

答案 1 :(得分:4)

如果some_named_scopeCaseStudy模型的 named_scope ,您可以使用send来调用与params[:action]值对应的方法。但这显然是可以大量利用的。

所以,除了安全性,你可以继续:

@case_studies = CaseStudy.send(params[:action])

希望它有效。

答案 2 :(得分:0)

如果我理解你的意思,那就是你应该称之为:

@case_studies = CaseStudy.send(:some_named_scope)

您可以使用send调用方法并将符号或字符串传递给它。

答案 3 :(得分:0)

要在建议的白名单BookOfGreg的基础上增加一层安全性,请使用public_send而不是send,它仅适用于调用公共接口的方法,而send甚至可以使用私有方法。

所以:

CaseStudy.public_send(:some_scope)