我知道如何检查 lambda 的数量,但我不知道如何从范围中提取它。

这个问题是 4 年前提出的:

https://groups.google.com/forum/#!topic/rubyonrails-core/7Cs0T34mj8c



它在调用它之前寻求帮助以查找范围的元数。

有没有找到解决办法?

最佳答案

scope 方法没有显式参数,如下所示

irb(main):070:0> User.method(:active_users).parameters
=> [[:rest, :args]]
:rest 意味着参数被收集为一个数组。这允许一个人对任何数量的参数都没有参数。

对于接受参数的范围,如果您使用错误数量的参数调用,您将收到一个 ArgumentError - 有点像下面:
ArgumentError: wrong number of arguments (1 for 2)

我们可以利用这个 ArgumentError 来计算 arity,因为 arity 存在于错误消息中。

让我 提醒 您,它是一种 hack ,如果您迫切需要弄清楚基于 lambda 的范围的数量,它可能会很有用。

我们可以在 Model 中定义一个方法,该方法将尝试使用非常多的参数调用 scope,比如 100 个参数 - 从而强制 ArgumentError - 然后我们可以捕获消息并从中提取参数。

这种方法的一种可能实现如下所示:
def self.scope_arity scope_symbol
    begin
        send(scope_symbol, (1..100).to_a)
    rescue ArgumentError => e
        f = e.message.scan(/for\s+(\d+)/).flatten.first
        f.to_i.nonzero? || 0
    end
end

可能的用法如下:
irb(main):074:0> User.scope_arity(:active_users)
=> 2

关于ruby-on-rails - Rails 4 中作用域的多样性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34297956/

10-09 23:52