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

发布于 2024-12-10 12:56:14 字数 157 浏览 0 评论 0原文

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

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

Can I write this query shorter and/or more elegantly using the AREL/ActiveRecord API?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

硪扪都還晓 2024-12-17 12:56:14

您可以直接使用 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。它使您可以访问活动记录中的更多功能。您的查询如下:

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

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

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

You can do an OR operator with Arel directly but the syntax isn't hugely pretty and can get a bit hard to read. Here is what it would look like in 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(''))))

I'd suggest looking at the squeel gem. It gives you access to more arel functionality in active record. Your query would like like:

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

Here is the link for more info: http://erniemiller.org/projects/squeel/

There are a few different ways you can write that in squeel, it supports a few different syntax styles so if you don't liked the one above there are alternatives.

谷夏 2024-12-17 12:56:14

处理这个问题的明智方法(如果您有权限当然可以在数据库上执行此操作)是不允许数据库中存在空字符串值。然后你可以执行 Foo.where(:bar => nil)。我使用 attribute_normalizer 来实现此目的,并正确格式化值。

https://github.com/mdeering/attribute_normalizer

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

https://github.com/rubiety/nilify_blanks

如果您有保存良好的数据库(空字段的空字符串值或空字符串值可能尽可能短。(我自己更喜欢空字符串)。

The sane way to deal with this (if you have the rights do do this of course on the database) is to disallow empty string values in the database. Then you can do Foo.where(:bar => nil). I use attribute_normalizer for this, and also to format values correctly.

https://github.com/mdeering/attribute_normalizer

A quick search also reveals nilify blanks, but I haven't tried that because attribute normalizer already provides that functionality for me.

https://github.com/rubiety/nilify_blanks

The resulting sql for the search you want if you have a well kept database (either null or empty string values for empty fields is probably as short as it gets. (I prefer empty strings myself).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文