我在模型上定义了两个类似范围的方法:
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}}。
我怎样才能实现我的目标?
答案 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