1

我有一个 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 的数据?

谢谢

更新

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

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
4

1 回答 1

1

AFAIK,嵌入式文档不能有引用关系。embedded_in所以对和的调用has_one是矛盾的。

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

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

user.save!

看起来您尝试执行的操作类似于 SQL JOIN 表。如果这是您想要实现的目标,那么最好利用 Mongoid 出色的 NN 引用映射(除非您需要在“加入”集合中存储额外的数据)。我会做类似的事情:

class User
  include Mongoid::Document
  has_and_belongs_to_many :missions
end

class Mission
  include Mongoid::Document
  has_and_belongs_to_many :users
end

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

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

has_many :users

然后has_one :mission从 User 模型更改为:

belongs_to :mission

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

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

于 2012-10-03T00:33:43.693 回答