gpt4 book ai didi

ruby-on-rails - 使用 Arel 对 AND 和 OR 子句进行分组

转载 作者:行者123 更新时间:2023-12-04 12:52:55 25 4
gpt4 key购买 nike

我正在尝试在我的 Rails 模型中构建一个作用域,当它被调用时,会在 7 个 bool 字段上为我提供一组嵌套的 AND 和 OR 子句。为了清楚起见,下面是一个简化了列名称的示例:

SELECT * FROM mytable
WHERE (a AND b AND c) OR (a AND d AND e) OR (a AND f AND g);

请注意 a 列出现在所有三个子句中。另一种写法是:

SELECT * FROM mytable
WHERE a AND ((b AND c) OR (d AND e) OR (f AND g));

Arel 似乎对第二种形式不太宽容。我已经非常接近以下范围:

scope :needs_any_delivery, lambda {
table = self.arel_table
common_assert = table[:a].eq(true)
where(
common_assert.and(
table[:b].eq(true).and(
table[:c].eq(false)
)
).or(
common_assert.and(
table[:d].eq(true).and(
table[:e].eq(false)
)
).or(
common_assert.and(
table[:f].eq(true).and(
table[:g].eq(false)
)
)
)
)
)
}

这会产生以下查询:

SELECT * FROM mytable
WHERE (
(a = 't' AND b = 't' AND c = 'f'
OR (a = 't' AND d = 't' AND e = 'f' OR a = 't' AND f = 't' AND g = 'f')
)
)

它很接近,但是第三个 AND 组没有与第二个 AND 组分开。我发现,如果我将一些额外的伪造 子句放在第三组的末尾,那么 Arel 会适本地将第三个子句单独分组......但这似乎是一个 hack。

想知道是否有任何 rails/arel 专家有任何想法。谢谢!

最佳答案

如果您像我一样真的想继续使用 Arel 来实现此功能,我发现创建新的 方法似乎是最佳途径。

我添加了一个名为 arel_fixed_or.rb 的新初始化器,其内容如下:

Arel::Nodes::Node.class_eval do

###
# Factory method to create a Nodes:Or that has a Nodes::Grouping
# node as a child.
def fixed_or right
Arel::Nodes::Or.new self, Arel::Nodes::Grouping.new(right)
end

end

无论您通常想在何处使用 or 语句,您都可以继续使用 fixed_or,然后将一个 or-ed 分组语句附加到你的条款,对我来说应该是预期的方法。如果这对您没有意义,请随意删除 Arel::Nodes::Grouping 部分。

需要注意的一件事是,您可能仍然需要手动放置分组,以便用方括号括起正确的元素。例如:

table = Arel::Table.new(:mytable)
common_assert = table[:a].eq(true)

first_or = table[:b].eq(true).and(table[:c].eq(true))
second_or = table[:d].eq(true).and(table[:e].eq(true))
third_or = table[:f].eq(true).and(table[:g].eq(true))

common_assert.and(
table.grouping(
table.grouping(first_or)
.fixed_or(second_or)
.fixed_or(third_or)
)
)

它的to_sql输出变成:

"mytable"."a" = 't' AND (
("mytable"."b" = 't' AND "mytable"."c" = 't') OR
("mytable"."d" = 't' AND "mytable"."e" = 't') OR
("mytable"."f" = 't' AND "mytable"."g" = 't')
)

关于ruby-on-rails - 使用 Arel 对 AND 和 OR 子句进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15037916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com