Родительская ассоциация для внедренного документа с использованием MongoMapper - PullRequest
2 голосов
/ 25 октября 2010

Если у меня есть:

class Post
  include MongoMapper::Document

  has_many :comments
end

Если я это сделаю:

class Comment
  include MongoMapper::EmbeddedDocument

  belongs_to :post # relevant part
end

Создает ли это ассоциацию, используя _root_document / _parent_document, или мне нужно добавить (избыточный) key :post_id?

Ответы [ 2 ]

9 голосов
/ 05 ноября 2010

Вам не нужны post_id или assign_to: post. Вместо этого вы можете использовать встроенный_пост: пост. Это создаст метод чтения для _parent_reference с именем post, поэтому вы можете сказать comment.post вместо comment._parent_reference.

class Comment
  include MongoMapper::EmbeddedDocument

  embedded_in :post
end
0 голосов
/ 25 октября 2010

Вам нужен ключ post_id.

Вот как я это проверил (с классами, как в вопросе):

> post = Post.new
 => #<Post _id: BSON::ObjectId('4cc5955ec2f79d4c84000001')>
> comment = Comment.new
 => #<Comment _id: BSON::ObjectId('4cc59563c2f79d4c84000002')>
> post.comments << comment
 => [#<Comment _id: BSON::ObjectId('4cc59563c2f79d4c84000002')>]
> post.save
 => true
> post.reload
 => #<Post _id: BSON::ObjectId('4cc5955ec2f79d4c84000001')>
> comment = post.comments.first
 => #<Comment _id: BSON::ObjectId('4cc59563c2f79d4c84000002')>
> comment.post
 => nil
> class Comment
?>  key :post_id
?>  end
 => #<MongoMapper::Plugins::Keys::Key:0xb5ab0328 @name="post_id", @type=nil, @default_value=nil, @options={}>
> comment
 => #<Comment post_id: nil, _id: BSON::ObjectId('4cc59563c2f79d4c84000002')>
> comment.post
 => nil
> comment.post = post
 => #<Post _id: BSON::ObjectId('4cc5955ec2f79d4c84000001')>
> comment.save
 => true
> comment.post
 => #<Post _id: BSON::ObjectId('4cc5955ec2f79d4c84000001')>
...