En MongoMapper, ¿cuál es la diferencia entre un documento y un EmbeddedDocument?
-
29-09-2019 - |
Pregunta
Este ejemplo hace que parezca que tanto se utilizan (include
d) con el fin de hacer una clase un modelo persistente, pero no está claro cuando debería usar uno u otro.
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.