【问题标题】:Can I write this query more elegantly with AREL/ActiveRecord?我可以用 AREL/ActiveRecord 更优雅地编写这个查询吗?
【发布时间】:2011-10-18 23:12:35
【问题描述】:

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

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

【问题讨论】:

  • 可能不会。原始 SQL 通常更简洁。它有时也直接与特定的 DBM 相关联,这是 ORM 开始大放异彩的地方,因为它们的耦合度较低。

标签: ruby activerecord arel


【解决方案1】:

您可以直接使用 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/

您可以通过几种不同的方式在 squeel 中编写它,它支持几种不同的语法风格,因此如果您不喜欢上面的一种,还有其他选择。

【讨论】:

  • 似乎 squeel 已经 3 年多没有更新了。看起来继任者现在是:github.com/rzane/baby_squeel 如果您需要迁移,他们也有文档。
【解决方案2】:

处理此问题的明智方法(如果您有权在数据库上执行此操作)是在数据库中禁止空字符串值。然后你可以做 Foo.where(:bar => nil)。我为此使用 attribute_normalizer,并正确格式化值。

https://github.com/mdeering/attribute_normalizer

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

https://github.com/rubiety/nilify_blanks

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

【讨论】:

  • 是的,这将是理想的,但在这种情况下不是可维护的解决方案
猜你喜欢
  • 2021-03-18
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 2014-05-01
相关资源
最近更新 更多