Ruby:点按不工作?

时间:2012-07-10 00:49:33

标签: ruby-on-rails ruby class tap

为我的application_controller编写代码以将用户输入转换为查询,这有效:

result_set =  model  # some implementation of ActiveRecord::Base as a Class
.includes(:metric_template => [:group]) #still need to abstract this
.where(f)  
.order(sort_string)
.limit(rows)
.offset((page-1)*rows)

这不起作用,因为似乎没有调用where方法:

result_set =  model
.includes(:metric_template => [:group])  #still need to abstact this
.tap{|o| o.where(f) if f}
.order(sort_string)
.limit(rows)
.offset((page-1)*rows)

我真的很喜欢.tap()在这里工作。为什么不呢?它不是一种类方法吗?可以说服吗?

感谢任何指导。

2 个答案:

答案 0 :(得分:2)

where被调用就好了。问题是where没有任何明显的副作用 - 它仅用于返回值。

由于tap对块的返回值没有任何作用,因此将tap与没有明显副作用的块一起使用是没有意义的。

答案 1 :(得分:1)

这是你(有效)想要的:

result_set = model.
  includes(:metric_template => [:group]).  #still need to abstact this
  order(sort_string).
  limit(rows).
  offset((page-1)*rows)
result_set = result_set.where(f) if f

这实际上并不是一种需要tap的情况,这对于在不改变方法返回值的情况下对方法中的项进行操作最有用(出于sepp2k解释的原因)。

此外,最好将此查询移动到模型内的方法中。