2011-11-22 33 views
1

我是很新的MongoDB和我使用西纳特拉和mongomapper与以下设置更新嵌入文档的值:Mongomapper嵌入文档“无法序列化对象”错误

class TeamMember 
    include MongoMapper::Document 

    key :name, String, :required => true 

    many :team_member_projects 
end 

class TeamMemberProject 
    include MongoMapper::EmbeddedDocument 

    key :date, Date, :required => true 

    one :project 
end 

class Project 
    include MongoMapper::Document 

    key :name, String, :required => true 
end 

的修改代码:

team_member = TeamMember.find(params[:team_member]) 
project = Project.find(params[:project]) 
date = Date.parse(params[:date]) 

tm_project = TeamMemberProject.new(:project => project, :date => date) 
team_member.push(:team_member_projects => tm_project) 
team_member.save 

,但我得到的错误.push行:

BSON::InvalidDocument at /project/add 
Cannot serialize an object of class TeamMemberProject into BSON. 

我没有正确声明我的嵌入式文档吗?或者还有另一种更新嵌入式文档的方式,我不知道。我试图使用方法:http://mongomapper.com/documentation/plugins/modifiers.html#push

回答

1

这似乎是工作

team_member = TeamMember.find(params[:team_member]) 
project = Project.find(params[:project]) 
date = Date.parse(params[:date]) 

tm_project = TeamMemberProject.new(:project_id => project.id, :date => date) 
team_member.team_member_projects << tm_project 
team_member.save 

好像我不得不使用project.id。不知道为什么。也不知道为什么我的.push不起作用,因为我会认为它的作用与<<一样。

+0

我注意到同样的事情......可能是一个错误。我会在github上报告该项目的一个,看看他们说了些什么。 –

+0

我不确定这是一个错误。修饰符只是简单的,方便MongoDB修饰符的包装。修饰符甚至不更新Ruby中的相关文档,他们直接进入数据库。所以,“.push”不会意识到MongoMapper关联。 'team_member.push(:team_member_projects => tm_project.to_mongo)'虽然可以工作。 –