Когда вы говорите:
embeds_many :books
, что на самом деле производит массив хэшей внутри MongoDB, а затем оборачивает некоторые Mongoid вещи вокруг этого массива и его элементов. Таким образом, вы просматриваете встроенные документы, как если бы вы искали любой другой массив хешей.
Например, если ваш Book
имеет заголовок поля, то вы могли бы сказать:
users = User.where('books.title' => /Pancakes/)
найти всех пользователей с книгами о блинах. Конечно, это дает вам кучу User
s, а не Book
s. Встроенные документы не существуют сами по себе, они всего лишь часть их родительского документа, поэтому вам нужно пройти через родителя. Но, как только у вас есть какие-то User
с, вы можете извлечь книги вы заинтересованы в:
books = users.map(&:books).flatten.select { |b| b.title =~ /Pancakes/ }
Вы также можете бросить в only
, если ваши User
s большие и вы не хотите, чтобы вытащить весь User
s из MongoDB:
# Some versions of Mongoid will get upset if you don't include :id
books = users.only(:books, :id).map...
Если вы делаете такие вещи много, то возможно Book
не должны быть встроены в User
.