我想在运行时发现查询范围应该接收的参数数量。
我尝试了以下内容:
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对象的引用,以便我可以反思它吗?
答案 0 :(得分:1)
看起来你无法访问范围的proc。你得到了params args,因为它的定义是这样的
答案 1 :(得分: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
将按预期工作。