ruby-on-rails - 合并两个活动记录关联轨道
问题描述
我们正在 ruby on rails 中实现过滤器,过滤器可以与 AND/OR 条件结合使用。
实现过滤条件之间的 OR
过滤器 1 或过滤器 1 或过滤器 3 = 我们使用 rails 或方法实现了这一点(https://blog.bigbinary.com/2016/05/30/rails-5-adds-or-support-in-active-record. html ) 通过将两个活动记录关系与 OR 结合起来。
例如:过滤条件是,
id is 1 or id is 2
为达到这个,
Person.where(id: 1).or(Person.where(id: 2)
产生的查询将是, SELECT "people".* FROM "people" WHERE ("people"."id" = $1 OR "people"."id" = $2) [["id", 1], ["id", 2]]
在过滤条件之间实现AND
我们面临的主要问题是将过滤器与 AND 条件结合起来,
id is 1 AND id is 2
我们尝试在 rails 中使用 merge 方法,但使用该方法,相同的条件将被最新的条件覆盖。也发现了这个问题
Person.where(id:1).merge(Person.where(id:2))
# The first condition is overridden by second, if the same condition is on the same column.
Person Load (0.7ms) SELECT "people".* FROM "people" WHERE "people"."id" = $1 [["id", 2]]
注意:我提供的示例可能看起来很简单,但过滤器逻辑确实很复杂,因此我们不能只在其中链接 rails 范围。
((id is 1 or id is 2) AND (id is 10 or id is 20))
这就是一个简单的过滤器的样子。可以添加更多的复杂性。我们的过滤器看起来像ransack 演示应用程序。
我们要做的是用 OR 组合所有内部块,用 AND 组合所有外部块。如果过滤条件为 AND 并且要在同一列中查询该列,任何人都可以提出更好的方法吗?
提前致谢。
我们还考虑获取 where 条件并进行字符串连接。但希望这是最坏的情况。
解决方案
要实现OR
和AND
之间的过滤条件,您可以简单地使用arel table。Arel 表使复杂的查询更简单,更容易做。
推荐阅读
- java - 如何将一个微服务认证为另一个(spring cloud)
- python - 为什么这给了我“列表索引超出范围”?我正在尝试在列表中查找名称,并且名称可以是两个词长或更多
- reactjs - 如何在 react-native 中实现具有透明背景的视频
- javascript - Google Script:在编辑时将行复制到另一张纸上
- scala - 从 Dataframe 中删除所有具有一个值的列(更有效)
- sas - 在 PROC SQL 中提取子集后的最小值
- css - 在@-moz-document 受到限制之后,现在拥有特定于 Firefox 的 CSS 规则的最佳方式是什么
- java - 如何在Android中将“yyyy-MM-dd'T'HH:mm:ss.SSSXXX”日期格式解析为简单?
- r - 在 sparklyr tbl 上计算 qchisq
- php - 我怎样才能实时显示数据库?