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にアクセスできないようです。そして、 params 引数を取得します。これは、次のように定義されているためです

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

于 2013-09-28T18:28:33.573 に答える