首页 > 解决方案 > 合并两个活动记录关联轨道

问题描述

我们正在 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 条件并进行字符串连接。但希望这是最坏的情况。

标签: ruby-on-railsactiverecordfilterruby-on-rails-5

解决方案


要实现ORAND之间的过滤条件,您可以简单地使用arel table。Arel 表使复杂的查询更简单,更容易做。

另一种方式,您仍然可以使用ransack。我认为就是你想要的ransack


推荐阅读