MongoDB MongoMapper обновляет встроенный документ (ruby on rails) - PullRequest
1 голос
/ 03 ноября 2011

Это сводит меня с ума, и я дошел до того, что мне кажется, что я могу неправильно использовать встроенные документы.

class User
    include MongoMapper::Document
    key :name, String
    many :businesses
end

class Business
    include MongoMapper::EmbeddedDocument
    key :name, String
    one :address
    many :clients
    belongs_to :user
end

class Address
    include MongoMapper::EmbeddedDocument
    key :name, String
    belongs_to :business
end

class Client
    include MongoMapper::EmbeddedDocument
    key :name, String
    belongs_to :business
end

Я создал пользователя, а затем бизнес, что я хотел бысейчас я добавляю адрес в бизнес, но мне не удается.

Единственное, о чем я могу думать, - это найти пользователя по имени или идентификатору, а затем перебрать массив бизнесов, найти бизнес, который соответствуетНазовите и установите адрес ...

но, честно говоря, это звучит очень глупо, и я предполагаю, что есть более элегантный способ сделать это.

Спасибо

1 Ответ

0 голосов
/ 04 ноября 2011

Прежде всего, когда вы встраиваете, вы используете 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
...