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

Pol*_*her 8 ruby activerecord ruby-on-rails

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

@case_studies = CaseStudy.call("some_named_scope")
Run Code Online (Sandbox Code Playgroud)

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

@case_studies = CaseStudy.call(params[:action])
Run Code Online (Sandbox Code Playgroud)

编辑

原谅我,我刚刚意识到我正在考虑发送方法,一些字呼叫如何卡在我脑海中.但@case_studies = CaseStudy.send(params[:action])按照我的想法行事.

Boo*_*reg 7

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

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

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


kol*_*rie 5

如果some_named_scope是模型的named_scope,则CaseStudy可以使用send调用与params[:action]value 对应的方法。但这显然是可利用的。

因此,除安全性外,您可以进行以下操作:

@case_studies = CaseStudy.send(params[:action])
Run Code Online (Sandbox Code Playgroud)

希望它能工作。