Pregunta

Este ejemplo hace que parezca que tanto se utilizan (included) con el fin de hacer una clase un modelo persistente, pero no está claro cuando debería usar uno u otro.

¿Fue útil?

Solución

A MongoMapper::Document se guarda en la base de datos como un registro de nivel superior. Un MongoMapper::EmbeddedDocument se guarda dentro de otro documento. Por ejemplo, digamos que tengo una aplicación de blogs. Tengo un modelo Post y Comment. Podrían ser algo como esto:

require 'mongo_mapper'
MongoMapper.database = 'test'

class Post
  include MongoMapper::Document

  key :title
  key :body
  key :comments

  many :comments
end

class Comment
  include MongoMapper::EmbeddedDocument

  key :author
  key :body
end

p = Post.new(:title => 'Some post', :body => 'About something')
p.comments << Comment.new(:author => 'Emily', :body => 'A comment')

p.save

puts Post.all.map(&:inspect)

producirá un documento en su base de datos mongo que es similar al siguiente:

{ "_id" : ObjectId("4c4dcf4b712337464e000001"),
  "title" : "Some post",
  "body" : "About something",
  "comments" : [
        {
                "body" : "A comment",
                "author" : "Emily",
                "_id" : ObjectId("4c4dcf4b712337464e000002")
        }
] }

En términos de interactuar con ellos a través de MongoMapper, solamente una respuesta MongoMapper::Document a métodos como find y save. Un MongoMapper::EmbeddedDocument sólo se puede acceder a través de su documento de nivel superior. La implicación de esto es que sólo se debe utilizar para los modelos MongoMapper::EmbeddedDocument que son claramente subsidiaria a sus modelos de padres y sólo serán utilizados en el contexto de ese padre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top