instance_eval一个proc数组

时间:2015-02-06 17:53:28

标签: ruby activerecord

我有一个如下所示的数组:

conditions = []
conditions << Proc.new { where(own_property: 1) }
conditions << Proc.new { where(case_enabled: true) }
conditions
 => [#<Proc:0x007fb4675acc10@(irb):4>, #<Proc:0x007fb4675a5640@(irb):5>] 

我将ActiveRecord查询方法封装在存储在数组中的proc对象中。我试图找到一种方法来获取此数组,然后像这样调用它:

Practice.where(own_property: 1).where(case_enabled: true)

有人向我展示了将proc传递给对象的技术,以便在该对象的上下文中进行评估:

Practice.instance_eval(&p)

上面我们使用一元&将单个proc对象转换为一个块,然后在Practice的上下文中进行评估。这非常有效。但是一系列的Procs呢?试图在一系列proc上使用&显然不起作用:

Practice.instance_eval(&conditions)
TypeError: wrong argument type Array (expected Proc)

如果我尝试在将proc对象作为块传递给Practice.instance_eval之前调用proc对象,则会在原始定义的上下文中对它们进行评估:

Practice.instance_eval(&conditions.map(&:call))
NoMethodError: undefined method `where' for main:Object

是否有另一种方法可以在实践的上下文中评估这些过程数组?

1 个答案:

答案 0 :(得分:1)

看起来我已经使用了方便的reduce(aka inject)方法:

conditions.inject(Practice) {|model, p| model.instance_eval(&p)}