我可以使用AREL / ActiveRecord更优雅地编写此查询吗?

时间:2011-10-18 23:12:35

标签: ruby activerecord arel

我可以使用AREL / ActiveRecord API更短和/或更优雅地编写此查询吗?

Foo.where("(bar is not null and bar != '') or (baz is not null and baz !='')")

2 个答案:

答案 0 :(得分:10)

您可以直接使用Arel执行OR运算符,但语法不是很漂亮,可能会有点难以阅读。这是它在arel中的样子:

foo  = Foo.arel_table
Foo.where(foo[:bar].not_eq(nil).and(foo[:bar].not_eq('')).or(foo[:baz].not_eq(nil).and(foo[:baz].not_eq(''))))

我建议看一下squeel gem。它使您可以访问活动记录中的更多arel功能。您的查询需要:

Foo.where{(bar.not_eq nil) & (bar.not_eq '') | (baz.not_eq nil) & (baz.not_eq nil)}

以下是更多信息的链接:http://erniemiller.org/projects/squeel/

你可以通过几种不同的方式来编写它,它支持几种不同的语法风格,所以如果你不喜欢上面的那种,那么就有其他选择。

答案 1 :(得分:1)

处理这个问题的理智方法(如果你有权利在数据库中这样做)是禁止数据库中的空字符串值。然后你可以做Foo.where(:bar => nil)。我为此使用了attribute_normalizer,并且还正确地格式化了值。

https://github.com/mdeering/attribute_normalizer

快速搜索还会显示nilify空白,但我没有尝试过,因为属性规范化器已经为我提供了这个功能。

https://github.com/rubiety/nilify_blanks

如果你有一个保存完好的数据库,那么你想要的搜索结果是sql(空字段的空值或空字符串值可能就像它得到的那么短。(我自己更喜欢空字符串)。