2012-07-10 70 views
2

编写代码为我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) 

这不起作用,因为在那里方法似乎不被称为:

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

我不知道它是否与事实不同,这不是一个真正的方法链,而是Arel DSL。无论如何,我确信你可以使用Arel构造来代替水龙头。你想达到什么目的? – 2012-07-10 01:08:45

+0

你想在这里做点什么? – 2012-07-10 01:09:14

+0

目的是有条件地调用方法链中的model.where()。我准备总是调用where,并有条件地覆盖像'1 = 1'这样的过滤器,但是它有一点点......呃,你知道的。 – 2012-07-10 02:41:07

回答

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解释的原因)。

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

+0

成功!谢谢。有趣的建议将其移入模型,可能是一个mixin,因为我正在从jqGrid接收请求参数并动态返回正确的结果(过滤/排序/分页)。我为几个模型做了这个。 – 2012-07-10 03:18:18

2

where被称为很好。问题是where没有任何可见的副作用 - 它仅用于返回值。

由于tap不对块的返回值做任何事情,因此使用tap时没有任何意义,因为块没有可见的副作用。

+0

是的,我看到我在期待一些不合理的事情。谢谢。 – 2012-07-10 03:19:54