通过 OR 或 AND 连接(粘合)where 条件(Arel、Rails3)

发布于 2024-10-01 02:14:07 字数 512 浏览 4 评论 0原文

我有几个复杂查询(使用子查询等),并希望用 OR 或 AND 语句将它们粘合在一起。

例如:

where1=table.where(...)
where2=table.where(...)

我想要类似

where3=where1.or where2

下一个示例的内容对我不起作用:

users.where(users[:name].eq('bob').or(users[:age].lt(25)))

因为我有几个 where(..) 查询,并且我想将它们连接起来。

换句话说

我有3种方法:第一个返回第一个where,第二个第二个,第三个 - OR 连接。

我必须能够在我的应用程序中使用所有 3 种方法并保存DRY代码

I have several complex queries (using subqueries, etc...) and want to glue them together with OR or AND statement.

For example:

where1=table.where(...)
where2=table.where(...)

I would like something like

where3=where1.or where2

Next example doesn't work for me:

users.where(users[:name].eq('bob').or(users[:age].lt(25)))

because of I have several where(..) queries and I want to concatenate them.

In other words

I have 3 methods: first return first where, second-second, third - OR concatenation.

I must have able to use all 3 methods in my application and save DRY code

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

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

发布评论

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

评论(3

-小熊_ 2024-10-08 02:14:07

您是否正在寻找以下形式:

users.where(users[:name].eq('bob').or(users[:age].lt(25)))

文档:https://github.com/rails/arel

are you looking for the form:

users.where(users[:name].eq('bob').or(users[:age].lt(25)))

docs: https://github.com/rails/arel

江心雾 2024-10-08 02:14:07

users.where(users[:name].eq('bob').or(users[:age].lt(25))) 很接近,但是您需要获取 arel_table 来指定列,例如

t = User.arel_table
User.where(t[:name].eq('bob').or(t[:age].lt(25)))

users.where(users[:name].eq('bob').or(users[:age].lt(25))) is close, but you need to get the arel_table to specify the columns, e.g.

t = User.arel_table
User.where(t[:name].eq('bob').or(t[:age].lt(25)))
蒗幽 2024-10-08 02:14:07

我知道对于 AND 连接,你可以这样做:

users = User.where(:name => 'jack')
users = users.where(:job => 'developer')

并且你可以在 SQL 中得到 AND 的连接(在最后用 #to_sql 尝试)

除此之外,你还可以这样做:

where1=table.where(...)
where2=table.where(...)
where1 & where2

例如:

(User.where(:name => 'jack') & User.where(:job => 'dev')).to_sql
=> "SELECT `users`.* FROM `users` WHERE `users`.`name` = 'jack' AND `users`.`job` = 'dev'" 

I know that for AND concatenation you can do:

users = User.where(:name => 'jack')
users = users.where(:job => 'developer')

and you get a concatenation with AND in SQL (try it with #to_sql at the end)

Other than that you can do:

where1=table.where(...)
where2=table.where(...)
where1 & where2

example:

(User.where(:name => 'jack') & User.where(:job => 'dev')).to_sql
=> "SELECT `users`.* FROM `users` WHERE `users`.`name` = 'jack' AND `users`.`job` = 'dev'" 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文