gpt4 book ai didi

ruby - Mongoid:对单个字段进行多次检查

转载 作者:可可西里 更新时间:2023-11-01 09:58:23 26 4
gpt4 key购买 nike

我需要选择与给定交易类型相同的交易。我需要检查它是否不会返回所有类型为 nil 的交易。

使用 ActiveRecord 我可以轻松地写:

given_transaction = Transaction.first
needed_transactions = Transaction.where('type != nil and type = ?', given_transaction.type)

所有作品

当我尝试用 mongoid 写同样的东西时:

needed_transactions = Transaction.where(:type => given_transaction.type, :type.ne => nil)

它生成以下查询:

"query"=>{:type=>{"$ne"=>"planned"}}

换句话说,mongoid 忽略第一次检查,只使用字段上的最后一次检查。

我尝试了“all_of”、“all_in”、“and”——但仍然找不到有效的解决方案。

也许我做错了什么……我的世界因此而颠倒了……:(((

最佳答案

来自fine manual :

All queries in Mongoid are Criteria, which is a chainable and lazily evaluated wrapper to a MongoDB dynamic query.

并查看 the Criteria docs for where我们看到一堆只有一个条件的例子。但请记住上面提到的可链接性。也许您正在寻找这个:

needed_transactions = Transaction.where(:type => given_transaction.type).where(:type.ne => nil)

Criteria#and文档也可能是很好的阅读 Material :

Adds another simple expression that must match in order to return results. This is the same as Criteria#where and is mostly here for syntactic sugar.

MONGOID
# Match all people with last name Jordan and first name starting with d.
Person.where(last_name: "Jordan").and(first_name: /^d/i)

MONGODB QUERY SELECTOR
{ "last_name" : "Jordan", "first_name" : /^d/i }

我不得不承认我不明白你为什么要那样检查 :type 两次;如果 given_transaction.type.nil? 是可能的,那么您甚至可以在不查询数据库的情况下处理它。

顺便说一句,对于 ActiveRecord,您会想这样说:

Transaction.where('type is not null and type = ?', given_transaction.type)

就您收到的奇怪查询而言,当您这样做时:

Transaction.where(:type => given_transaction.type, :type.ne => nil)

Mongoid 最终尝试为 :type 键构建一个具有两个值的哈希:

{ :type => 'planned' }
{ :type => { :$ne => nil } }

不知何故,它最终将 nil 替换为 'planned'。我不知道 Mongoid 的 where 或它修补到 Symbol 中的方法的内部细节,我只是从观察到的行为回溯。

关于ruby - Mongoid:对单个字段进行多次检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9389793/

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