Ruby on rails 3 保存会在mongoid中嵌入许多内容

Ruby on rails 3 保存会在mongoid中嵌入许多内容,ruby-on-rails-3,mongodb,persistence,mongoid,embedded-database,Ruby On Rails 3,Mongodb,Persistence,Mongoid,Embedded Database,我有很多关联,当我保存父文档时,子文档不会被保存 class User include Mongoid::Document embeds_many :user_missions attr_accessible :user_missions_attributes accepts_nested_attributes_for :user_missions, allow_destroy: true end class UserMission include Mongoid::Do

我有很多关联,当我保存父文档时,子文档不会被保存

class User
  include Mongoid::Document

  embeds_many :user_missions
  attr_accessible :user_missions_attributes
  accepts_nested_attributes_for :user_missions, allow_destroy: true
end

class UserMission
  include Mongoid::Document

  embedded_in :user, :inverse_of => :user_missions

  has_one :mission, autosave: true
  validates_presence_of :mission

  attr_accessible :mission_title

  def mission_title
    mission.try(:title)
  end

  def mission_title=(title)
    self.mission = Mission.find_or_create_by(:title => title) if title.present?
  end
end
以下是我未通过的规范:

it "should save mission to user_mission when created" do
  user_mission = UserMission.new
  user = create(:user)
  user.user_missions << user_mission
  user_mission.mission_title = "Created Title"

  user.save!
  #user_mission.save!

  User.first.user_missions[0].mission.title.should == "Created Title"
end
当我在
#user_mission.save行中发表评论时它可以工作。问题是我需要它在表单中工作,我认为Mongoid会自动保存嵌入文档的字段

如何获取父用户文档以保存嵌入式UserMission的数据

谢谢

更新

这是我忘记添加的任务模型(不确定它是否重要):


好的,嵌入文档不能有引用关系。因此,对
embedded_in
has_one
的调用是相互矛盾的

除此之外,您是否尝试过对测试中的行重新排序,以便首先创建用户,然后通过用户创建
user\u mison

user = create(:user)
user_mission = user.user_missions.new
user_mission.mission_title = "Created Title"

user.save!
看起来您尝试执行的操作类似于SQL联接表。如果您正试图实现这一点,那么最好利用Mongoid令人敬畏的N-N引用映射(除非您需要在“join”集合中存储额外数据)。我会这样做:

class User
  include Mongoid::Document
  has_and_belongs_to_many :missions
end

class Mission
  include Mongoid::Document
  has_and_belongs_to_many :users
end
如果要通过用户创建任务,请在关系的任务端启用autosave

编辑:看到您的任务模型后,我意识到您正试图直接从您的任务模型中引用UserMission(
属于:user\u Mission
),这是一个嵌入式文档。就像我之前说的,不可行。您需要在顶级文档、用户和任务之间建立某种关系。您可以将该行更改为:

has_many :users
然后将
的任务从用户模型更改为:

belongs_to :mission
但是,您将无法从用户端使用autosave


编辑:纠正了显示从用户到任务的1-n关系的正确方法。

我创建了“连接”表,用于存储我稍后添加的额外信息(如创建的时间)。此外,用户嵌入了许多用户任务,并且用户任务嵌入到用户中。还有另一个模型,我忘了包括一个名为任务的模型,用户任务与它有一个has_one关系(我现在将它添加到更新中)。我只是尝试重新排序,但它不起作用。在看到任务类后编辑。另外,请确保在测试中创建任务实例。最后一行需要更改为
User.first.mission.title.should==“Created title”
,而不是通过User\u任务。我建议编写一个单独的测试来确保用户任务的标题设置正确。删除任务中的
属于
,并将
更改为一个:任务,自动保存:true
用户任务中的
属于:任务,:inverse\u of=>nil
有效。谢谢如果我想找到具有特定任务的所有用户任务,你建议我使用引用文档而不是嵌入文档吗?是的,你需要使用引用文档。或者,如果您设置了用户和任务之间的关系,您可以简单地查询与特定任务相关的用户,然后对其进行枚举以提取嵌入式用户任务。
has_many :users
belongs_to :mission