Из тонкой инструкции :
Все запросы в Mongoid являются критериями, которые являются цепочечной и лениво оцениваемой оболочкой для динамического запроса MongoDB.
И, глядя на Criteria docs для where
, мы видим множество примеров с одним условием. Но помните о связности , упомянутой выше. Возможно, вы ищете это:
needed_transactions = Transaction.where(:type => given_transaction.type).where(:type.ne => nil)
Документы Criteria#and
также могут хорошо читать:
Добавляет другое простое выражение, которое должно совпадать для возврата результатов. Это то же самое, что Criteria#where
и в основном здесь для синтаксического сахара.
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'
. Я не знаю внутренних деталей where
Монгоида или методов, которые он исправляет в Symbol, я просто возвращаюсь к наблюдаемому поведению.