为我的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()在这里工作。为什么不呢?它不是一种类方法吗?可以说服吗?
感谢任何指导。
答案 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解释的原因)。
此外,最好将此查询移动到模型内的方法中。