2010-12-09 4 views
1

HALLORubin dynamische Verkettungsverfahren

Ich versuche, einige dynamische definiert Methoden und Kette etwas gewissen Spielraum Methoden wie zu bauen:

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

Eine Idee ist, so etwas wie:

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 

in der Post haben wir Bereiche, spät, alt definiert ...

Jetzt können wir Methoden wie benennen:

Post.latest or Post.old_archived etc... 

Meine Fragen sind:

  1. Gibt es einen besseren Ansatz, dies zu tun? (ähnlich wie bei active record find aber ohne method_missing) das ist hässlich ...

  2. Wie kann ich Methoden dynamisch verketten?

ich bereits für Senden wissen (‚Methode‘, var), aber ich weiß nicht, wie diese Methoden von Strings unter der Bedingung ...

Dank

Antwort

0

Ich bin auf Basis beitreten Entschuldigung, aber es ist schwierig für mich, genau zu verstehen, was du verlangst. Und ich bin mir nicht sicher, ob Sie einige Begriffe richtig verwenden. Was meinen Sie mit "Scope-Methoden"? Meinst du eine Klassenmethode vs. eine Instanzmethode? Das würde den Umfang betreffen.

Und wenn Sie Chain sagen, Sie wollen eine Methode nach der anderen aufrufen? Wie so?

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

Ich will nur anmerken, dass Ihr nicht so dynamischen Teil oben geschrieben werden könnte:

method_action << ".#{prefix}" 

ich, ich bin nicht sicher, wenn Sie nur nicht die tatsächlichen in Ihrer Frage sehen jede Verkettungs so bedeuten Verkettung von Stichen zum dynamischen Erstellen von Namen. Wenn Sie tatsächlich Methoden verketten wollen, müssen Sie daran denken, dass Sie am Ende einer Methode, die Sie an diese Klasse kettenfähig machen möchten, immer self zurückgeben müssen.

Zum Beispiel:

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!") 

ausgeben würde:

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>