2010-12-09 2 views
1

HIрубин динамические методы Chaining

я пытаюсь построить некоторые динамические определенных методов и цепь некоторые методы Scope что-то вроде:

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

Одна идея, что это что-то вроде:

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 

в должности у нас есть defiend scopes последние, старые ...

Теперь мы можем назвать методы вроде:

Post.latest or Post.old_archived etc... 

Мои вопросы:

  1. Есть ли лучший подход для этого? (аналогично активному обнаружению записи, но без method_missing) это добрая уродливость ...

  2. Как я могу цеплять методы динамически?

Я уже знаю, для отправки («метод», вар), но я не знаю, как присоединиться к этим методам из строк на основе состояния ...

Благодаря

ответ

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> 
Смежные вопросы