рубиновые методы динамического связывания - PullRequest
1 голос
/ 09 декабря 2010

HI

Я пытаюсь создать некоторые динамически определенные методы и объединить некоторые методы области видимости, например:

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

в посте у нас есть новейшие области видимости, старые ...

Теперь мы можем вызывать методы, такие как:

Post.latest or Post.old_archived etc...

Мои вопросы:

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

  2. Как динамически объединить методы?

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

Спасибо

1 Ответ

0 голосов
/ 09 декабря 2010

Извините, но мне трудно понять, что именно вы спрашиваете.И я не уверен, что вы правильно используете некоторые термины, например, что вы подразумеваете под "методами области видимости"?Вы имеете в виду метод класса против метода экземпляра?Это относится к области.

И когда вы говорите «цепочка», вы имеете в виду вызывать один метод за другим?Как и так?

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

Я просто прокомментирую, что ваша не очень динамичная часть выше может быть написана:

method_action << ".#{prefix}"

Я не вижу никакой реальной цепочки в вашем вопросе, поэтому я 'Я не уверен, что вы просто хотите объединить строки для динамического построения имен.Если вы действительно хотите связать методы, вы должны помнить, что вам всегда нужно возвращать self в конце метода, который вы хотите сделать цепочкой обратно в этот класс.

Например:

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>
...