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...
我的问题是:
这样做有更好的方法吗? (类似于活动记录查找但没有method_missing)这是一种丑陋的......
如何动态链接方法?
我已经知道send('method',var),但我不知道如何根据条件从字符串中加入这些方法......
由于
答案 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>