如何反映ActiveRecord范围

时间:2013-09-28 18:01:10

标签: ruby-on-rails ruby ruby-on-rails-3 reflection rails-activerecord

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

我尝试了以下内容:

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对象的引用,以便我可以反思它吗?

2 个答案:

答案 0 :(得分:1)

看起来你无法访问范围的proc。你得到了params args,因为它的定义是这样的

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

答案 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将按预期工作。