我可以使用AREL / ActiveRecord API更短和/或更优雅地编写此查询吗?
Foo.where("(bar is not null and bar != '') or (baz is not null and baz !='')")
答案 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(空字段的空值或空字符串值可能就像它得到的那么短。(我自己更喜欢空字符串)。