1

こんにちは

私はいくつかの動的に定義されたメソッドを構築し、いくつかのスコープメソッドを次のように連鎖させようとしています:

define_method "#{instance_name_method}" do
        Kernel.const_get(model_name).___some_chaining methods basd on condition
end

そのための 1 つのアイデアは次のようなものです。

method_action = model_name #ex Post

['latest', 'old', 'deleted','latest_deleted','archived'].each do |prefix| 

  method_action << ".deleted"  if prefix.match('deleted') 
  method_action << ".latest"  if prefix.match('latest')
  method_action << ".old"  if prefix.match('old')

  define_method "#{prefix}_#{instance_name_method}" do
           eval( method_action)
    end


end

投稿では、最新、古いスコープを定義しています...

これで、次のようなメソッドを呼び出すことができます:

Post.latest or Post.old_archived etc...

私の質問は次のとおりです。

  1. これを行うためのより良いアプローチはありますか? (active record find に似ていますが、method_missing はありません) これはちょっと醜いです...

  2. メソッドを動的に連鎖するにはどうすればよいですか?

send('method',var) については既に知っていますが、条件に基づいて文字列からこれらのメソッドを結合する方法がわかりません...

ありがとう

4

1 に答える 1

0

申し訳ありませんが、あなたが何を求めているのか正確に理解するのは難しいです。また、いくつかの用語を正しく使用しているかどうかはわかりません。たとえば、「スコープメソッド」とはどういう意味ですか?クラスメソッドとインスタンスメソッドのどちらを意味しますか?それはスコープに関係します。

そして、チェーンと言うとき、次々にメソッドを呼び出すことを意味しますか?そのようです?

f = Foo.new
puts f.method1(some_value).method2(some_other_value)

上記のそれほど動的ではない部分を書くことができるとコメントします:

method_action << ".#{prefix}"

あなたの質問には実際の連鎖は見当たらないので、名前を動的に構築するために刺し傷を連結するつもりなのかどうかはわかりません。実際にメソッドをチェーンすることを意味する場合は、チェーン可能にしてそのクラスに戻すメソッドの最後で常に自分自身を返す必要があることを覚えておく必要があります。

例えば:

class Foo

  def method1(value)
    puts "method1 called with #{value}"
    self
  end

  def method2(value)
    puts "method2 called with #{value}"
    self
  end

end

f = Foo.new
puts f.method1("Hello").method2("World").method1("I can").method2("do this").method2("all").method1("day!")

出力します:

method1 called with Hello
method2 called with World
method1 called with I can
method2 called with do this
method2 called with all
method1 called with day!
#<Foo:0x0000010084de50>
于 2010-12-09T05:49:54.797 に答える