2017-06-16 14 views
0

Ruby onレールでこれを行うことは可能ですか?Railsの動的スコープ?

def method(scope: 'all') # so that it would use Model.all by default 
    Model.scope 
end 

method(scope: 'last(10)') # to get it to call Model.last(10) 

更新:明確化のため、これは特にレールにscopeクラスメソッドに関連しません。混乱を避けるために、当初は尋ねるときに「範囲」という言葉を使わないでください。代わりにmodel_methodと考えてみてください。しかし、最初に述べたように質問を残して、そのように答えられた答えの一つとして歴史を保存する。

+0

あなたはすでに 'Model.all'と' Model.last(10) 'をレールに入れています –

+0

あなたの質問はまったく紛らわしいものです。 –

+0

' Model.all'か 'Model.last(10) 'または' Model.some_other_method'になります。 – Magne

答えて

2

私はルビーの#sendkeyword argumentsを使用することにより、どのように見つけた、そして、次に

scope :scoping, ->(method = 'all') { send(method) } 
scope :scoping_with_arg, ->(method = 'limit', arg = 1) { send(method, arg) } 

...引数でとせずに処理するために、モデル自体に

Model.scoping('first') 
Model.scoping_with_arg('last', 10) 
+0

ありがとう、私は知っていますが、実行時に動的に呼び出す実際のスコープを決定したいと思います。 – Magne

+0

ブラウザからスコープを送信していることを教えてください。 – radubogdan

+0

@Magneランタイム中に*動的に説明してください*自分自身ではかなりダイナミックであると思います –

0

をそれぞれのスコープを定義することができます配列を使用して1つ以上の引数を持つモデルスコープをサポートする:

def method(scope: 'all', scope_args: []) # so that the method would call Model.all by default 
    Model.send(scope, *scope_args) 
end 

method(scope: 'last', scope_args: [10]) # to get it to call Model.last(10) 
method(scope: 'where', scope_args: [attribute: 'something']) # to get the method to call Model.where(attribute: 'something') 
+0

正確には、すべてをスコープする文字列を持つことはできません。引数を別々に渡す必要があります。 –

+0

括弧からパラメータを抽出するには、文字列を正規表現で解析する必要があります。 2番目のパラメータを避けるだけの価値はありませんでした。 '#send'に2番目のパラメータを提供するヒントをくれてありがとう、助けになりました! – Magne

+0

私はすでにそれを試みましたが、すべてのケース/連鎖可能なスコープをカバーしていなかったので、私はあなたにリストを求めました。 –