红宝石动态链接方法

时间:2010-12-09 01:26:01

标签: ruby dynamic methods defined chain

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. 如何动态链接方法?

  3. 我已经知道send('method',var),但我不知道如何根据条件从字符串中加入这些方法......

    由于

1 个答案:

答案 0 :(得分:0)

对不起,但我很难理解你的要求。而且我不确定你是否正确使用了一些术语,例如“范围方法”是什么意思?你的意思是类方法与实例方法?这与范围有关。

当你说链条时你的意思是一个接一个地调用一个方法吗?像这样?

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

我只是评论说你上面不那么有活力的部分可以写成:

method_action << ".#{prefix}"

我没有在你的问题中看到任何实际的链接,所以我不确定你是否只想连接stings来动态构建名称。如果你确实意味着连锁方法,你需要记住,你需要总是在方法的最后返回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>