将embeds_many保存在mongoid中

时间:2012-10-02 19:20:59

标签: ruby-on-rails-3 mongodb persistence mongoid embedded-database

我有一个embeds_many关联,当我保存父文档时,孩子们没有被保存。

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

我明白了:

undefined method `title' for nil:NilClass

当我在第#user_mission.save!行发表评论时,它有效。问题是我需要这个以表格形式工作,我认为Mongoid会自动保存嵌入文档的字段。

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

由于

更新

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

class Mission
  include Mongoid::Document

  belongs_to :user_mission, :inverse_of => :mission

  attr_accessible :title
  field :title, type: String
  validates_presence_of :title

  field :lowercase_title
  before_create :lower_title_case

  field :description, type: String

private
  def lower_title_case
    self.lowercase_title = self.title.downcase
  end
end

1 个答案:

答案 0 :(得分:1)

AFAIK,嵌入式文档不能有引用关系。因此,对embedded_inhas_one的调用是矛盾的。

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

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

user.save!

您尝试执行的操作类似于SQL JOIN表。如果这是你想要实现的,那么最好利用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

如果您想通过用户创建任务,请在关系的任务一侧启用自动保存。

编辑:在看到您的Mission模型后,我意识到您正在尝试直接从您的Mission模型直接引用嵌入式文档UserMission(belongs_to :user_mission)。就像我之前说的那样,不可行。您需要顶级文档,用户和任务之间的某种关系。您可以通过将该行更改为:

来使事情变得有效
has_many :users

然后将has_one :mission从用户模型更改为:

belongs_to :mission

但是,您无法在用户端使用自动保存。

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