Ruby 我可以用AREL/ActiveRecord更优雅地编写这个查询吗?

Ruby 我可以用AREL/ActiveRecord更优雅地编写这个查询吗?,ruby,activerecord,arel,Ruby,Activerecord,Arel,我可以使用AREL/ActiveRecordAPI将此查询写得更短和/或更优雅吗 Foo.where("(bar is not null and bar != '') or (baz is not null and baz !='')") 您可以直接使用Arel执行或运算符,但语法不是非常漂亮,可能会有点难以阅读。以下是arel的外观: foo = Foo.arel_table Foo.where(foo[:bar].not_eq(nil).and(foo[:bar].not_eq(''))

我可以使用AREL/ActiveRecordAPI将此查询写得更短和/或更优雅吗

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

您可以直接使用Arel执行
运算符,但语法不是非常漂亮,可能会有点难以阅读。以下是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(''))))
我建议你看看那块橡皮泥宝石。它使您可以在active record中访问更多arel功能。您的查询如下所示:

Foo.where{(bar.not_eq nil) & (bar.not_eq '') | (baz.not_eq nil) & (baz.not_eq nil)}
以下是有关详细信息的链接:


有几种不同的方法可以在squel中编写,它支持几种不同的语法样式,因此,如果您不喜欢上面的方法,可以使用其他方法。

处理此问题的明智方法(如果您有权在数据库中执行此操作)是禁止数据库中的空字符串值。然后,您可以做Foo.where(:bar=>nil)。我使用属性规格化器来实现这一点,还可以正确设置值的格式

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


如果您有一个保存良好的数据库(空字段的null或空字符串值可能与它得到的长度一样短),那么您想要搜索的结果sql(我自己更喜欢空字符串).

可能不是。原始SQL通常更简洁。它有时也直接与特定的DBM绑定,这是ORM开始发光的地方,因为它们之间的耦合不那么紧密。是的,这将是理想的,但在这种情况下不是一个可维护的解决方案。似乎squeel已经3年多没有更新过了。看起来继任者现在是:它们也如果您需要迁移,请使用ve文档。