0

我想在运行时发现查询范围应接收的参数数量。

我尝试了以下方法:

class Test < ActiveRecord::Base
    scope :my_scope, Proc.new{ |q, x|
      where("attr = ? and attrb = ?", q, x)
    }

    def self.my_scope_args
      self.method(:my_scope).parameters
    end
end

但是打电话

Test.my_scope_args

返回 [[:rest, :args]]。如果我直接反映在 Proc 对象上,我会得到想要的结果:

Proc.new{ |q, x|
    where("attr = ? and attrb = ?", q, x)
}.parameters

返回 [[:opt, :q], [:opt, :x]]

有一种方法可以获得对范围的基础 Proc 对象的引用,以便我可以对其进行反思?

4

2 回答 2

1

来自精美的Active Record Query Interface Guide

14.1 传入参数
[...]
使用类方法是接受范围参数的首选方式。这些方法仍然可以在关联对象上访问。

所以代替这个:

scope :my_scope, Proc.new{ |q, x|
  where("attr = ? and attrb = ?", q, x)
}

你应该这样说:

def self.my_scope(q, x)
  where(:attr => q, :attrb => x)
end

然后你my_scope_args会按预期工作。

于 2013-09-28T18:58:38.000 回答
1

您似乎无法访问范围的 proc。你得到了参数 args 因为它是这样定义的

https://github.com/rails/rails/blob/e5ef3abdd2336c34cd853a1f845f79b8b19fbb1b/activerecord/lib/active_record/scoping/named.rb#L161

于 2013-09-28T18:28:33.573 回答