gpt4 book ai didi

sql - Rails 不查询整个 Where 子句

转载 作者:行者123 更新时间:2023-12-03 17:34:40 24 4
gpt4 key购买 nike

是否有一种直接的方法来否定整个 where表达式使用 ActiveRecord/ARel?看来where.not() ,当给定参数的散列时,单独否定每个表达式,而不是用单个 SQL 否定整个事物 NOT .
rails 示例Thing.where.not(attribute1: [1,2], attribute2: [3,4], attribute3: [5,6])会产生 SQL:select * from things where attribute1 NOT IN (1,2) AND attribute2 NOT IN (3,4) AND attribute3 NOT IN (5,6)不过,这不是我想要做的。我想用一个 NOT 否定整个 where 子句.select * from things where NOT(attribute1 IN (1,2) AND attribute2 IN (3,4) AND attribute3 IN (5,6))在 bool 符号中,Rails 似乎喜欢否定 WHERE 子句的每个组件,如下所示:!(a) && !(b) && !(c)但我想否定整个表达式:! [ (a) && (b) && (c) ]使用德摩根定律,我可以将查询写为 !a || !b || !c ,但这会导致一些相当长和丑陋的代码(Rails 5 和 or 的长度较短,但仍然很丑)。我希望使用 ActiveRecord 或 ARel 时缺少一些语法糖?
背景故事
我正在编写 Ransack Equality Scope(例如 _eq)来搜索条件及其相反的条件。

scope :can_find_things_eq, ->(boolean = true) {
case boolean
when true, 'true'
where(conditions_for_things)
when false, 'false'
where.not(conditions_for_things)
end
}

def self.ransackable_scopes(_auth_object = nil)
%i[can_find_things_eq]
end
如果我使用上面的 Rails 5 建议和我开始的例子,我可以让我的否定查询工作......但代码又长又丑。
where.not(attribute1: [1,2]).or(where.not(attribute2:
[3,4)).or(where.not(attribute3: [5,6))
链接 Ors 和 WhereNots 有效,但它的可读性不是很强。有没有更好的方法来否定这个 where除了必须使用德摩根定律手动/逻辑地否定它?
谢谢!

最佳答案

你可以试试这个:

Thing.where.not(attribute1: [1,2]).or(Thing.where.not(attribute2: [3,4]).or(Thing.where.not(attribute3: [5,6])
这以与您需要的完全相同的方式生成查询:
!condition1 || !condition2 || !condition3

关于sql - Rails 不查询整个 Where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47777425/

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