Ruby on rails Rails中的动态作用域?

Ruby on rails Rails中的动态作用域?,ruby-on-rails,ruby,scope,Ruby On Rails,Ruby,Scope,在RubyonRails中可以做这样的事情吗 def method(scope: 'all') # so that it would use Model.all by default Model.scope end method(scope: 'last(10)') # to get it to call Model.last(10) 更新:为了澄清,这与Rails中的类方法没有特别的关系。在最初询问时,我可能应该避免使用“范围”一词,以避免混淆。您可以将其视为model\u方法。将保留

在RubyonRails中可以做这样的事情吗

def method(scope: 'all') # so that it would use Model.all by default
  Model.scope
end

method(scope: 'last(10)') # to get it to call Model.last(10)

更新:为了澄清,这与Rails中的类方法没有特别的关系。在最初询问时,我可能应该避免使用“范围”一词,以避免混淆。您可以将其视为
model\u方法
。将保留问题的原始状态,以保留历史记录,作为解决问题的答案之一。

您可以在模型本身中定义各自的范围,以处理有参数和无参数的问题

scope :scoping, ->(method = 'all') { send(method) }
scope :scoping_with_arg, ->(method = 'limit', arg = 1) { send(method, arg) }
那么


您可以在模型本身中定义各自的作用域,以处理带参数和不带参数的情况

scope :scoping, ->(method = 'all') { send(method) }
scope :scoping_with_arg, ->(method = 'limit', arg = 1) { send(method, arg) }
那么


通过使用ruby的
#send
关键字参数
,以及使用一个数组来支持具有多个参数的模型范围,我发现了这一点:

def method(scope: 'all', scope_args: []) # so that the method would call Model.all by default
  Model.send(scope, *scope_args)
end

method(scope: 'last', scope_args: [10]) # to get it to call Model.last(10)
method(scope: 'where', scope_args: [attribute: 'something']) # to get the method to call Model.where(attribute: 'something')

通过使用ruby的
#send
关键字参数
,以及使用一个数组来支持具有多个参数的模型范围,我发现了这一点:

def method(scope: 'all', scope_args: []) # so that the method would call Model.all by default
  Model.send(scope, *scope_args)
end

method(scope: 'last', scope_args: [10]) # to get it to call Model.last(10)
method(scope: 'where', scope_args: [attribute: 'something']) # to get the method to call Model.where(attribute: 'something')


你已经有了
Model.all
Model.last(10)
在Rails中你的问题到底是什么?很困惑我希望它动态调用
Model.all
Model.last(10)
Model,根据我设定的范围,你已经有了模型,所有的,所有的,最后的,你的问题到底是什么?我希望它动态地调用模型,所有的,所有的,或者模型,最后的,或者模型,其他的方法,基于我设置的
作用域
的内容。谢谢,我知道,但我想确定在运行时动态调用的实际作用域。请不要告诉我您是从浏览器发送作用域的。@Magne请在运行时动态解释,我认为它在运行时非常动态itself@radubogdan哈哈,不,那将是非常愚蠢的:)另一方面。。。这将把sql注入式攻击提升到一个全新的水平~~@Magne我不喜欢
#send
并在我的项目中使用关系合并或
#instance_exec
进行动态调用,但@Md.FarhanMemon似乎提供了完全符合您要求的代码。如果他没有,可能你的问题应该得到澄清。谢谢,我知道,但我想确定在运行时动态调用的实际作用域。请不要告诉我你是从浏览器发送作用域的。@Magne请在运行时动态解释,我认为它在运行时非常动态itself@radubogdan哈哈,不,那将是非常愚蠢的:)另一方面。。。这将把sql注入式攻击提升到一个全新的水平~~@Magne我不喜欢
#send
并在我的项目中使用关系合并或
#instance_exec
进行动态调用,但@Md.FarhanMemon似乎提供了完全符合您要求的代码。如果他没有,可能你的问题应该得到澄清。确切地说,你不能只有一个字符串来定义它的范围,需要单独传递参数。当然,你可以,但是你必须用正则表达式解析字符串,从括号中提取参数。仅仅为了避免第二个参数似乎不值得。感谢您提示为
#send
提供第二个参数,这很有帮助!我已经尝试过了,但它没有涵盖所有案例/可链接范围,这就是我要求您提供列表的原因。FFR:尽管这个实现很有效,但我最终放弃了它,因为它会招致太多的知识债务。将代码重构为应用程序中不同位置的不同方法。如果以牺牲可读性和直观性为代价,干涸代码并不总是好的。确切地说,你不能只有一个字符串来定义所有的范围,需要单独传递参数。当然,你可以,但是你必须用正则表达式解析字符串,从括号中提取参数。仅仅为了避免第二个参数似乎不值得。感谢您提示为
#send
提供第二个参数,这很有帮助!我已经尝试过了,但它没有涵盖所有案例/可链接范围,这就是我要求您提供列表的原因。FFR:尽管这个实现很有效,但我最终放弃了它,因为它会招致太多的知识债务。将代码重构为应用程序中不同位置的不同方法。如果以牺牲可读性和直觉为代价,干涸代码并不总是好的。