Прежде всего, когда вы встраиваете, вы используете embedded_in
вместо belongs_to
.
class Business
include MongoMapper::EmbeddedDocument
key :name, String
one :address
many :clients
embedded_in :user
end
class Address
include MongoMapper::EmbeddedDocument
key :name, String
embedded_in :business
end
class Client
include MongoMapper::EmbeddedDocument
key :name, String
embedded_in :business
end
Причина в том, что внутренне belongs_to
создает сложный прокси-сервер ассоциации, который выполняет всевиды взаимодействия с базой данных для не встроенных ассоциаций, тогда как embedded_in
просто создает псевдоним для метода _parent_document
.belongs_to
только для не встроенных ассоциаций.
Нет способа "красиво" запросить встроенные документы.Я думаю, что Mongoid позволяет вам делать вид, что встроенные ассоциации могут запрашиваться, как и обычные ассоциации, но MongoMapper не любит притворяться.В MongoMapper массив встроенных документов - это просто Array
с очень небольшим количеством сахара .MongoDB может в конечном итоге разрешить виртуальные коллекции встроенных документов (это проблема JIRA номер 1 ), и я думаю, что в этот момент парни из MM подумают о чем-то более причудливом.
По правде говоря, перечисляемый Rubyметоды настолько хороши, что это не , что безумие, чтобы делать находки самостоятельно.
user = User.find("1234567abc")
user.business.select { |b| b.name == target_name }.each { |b| b.address = new_address }
user.save