Ruby self in方法链

时间:2013-02-07 15:34:15

标签: ruby-on-rails

我在模型上定义了两个类似范围的方法:

def self.foo var
  where(foo: var)
end

def self.bar var
  where(bar: var)
end

我希望能够将nil传递给其中一种方法,并将其有效地忽略。所以:

var1 = 10
var2 = nil
# ...
Model.foo(var1).bar(var2)

我尝试了各种各样的事情,例如:

def self.bar var
  return self if var.nil?
  where(bar: var)
end

但是在上面的例子中,self没有返回从链接中的前一个方法传递的方法,它返回Model,因此我失去了{{{}}中完成的所有工作。 1}}。

我怎样才能实现我的目标?

2 个答案:

答案 0 :(得分:1)

我相信rails 3.x,你应该可以使用这样的东西:

return self.scoped if var.nil?

在rails 4.x中,您需要将其更改为:

return self.all if var.nil?

基本上,'scoped'(和rails 4'all')返回一个关系对象,你可以用其他的arel方法链接,而不会实际应用任何条件。

答案 1 :(得分:1)

all实际上运行查询而不是返回ActiveRelation 对象,该对象在实际需要返回结果时用于延迟加载查询(例如:当你实际运行each时)。否则,它根本不执行查询,从而节省了对数据库的调用。它还允许你基本上想要实现的好链接。

您可能想要尝试的是

def self.bar(val)
  return where({}) if val.nil?
  where(:bar => val)
end