我有一个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
答案 0 :(得分: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的令人敬畏的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关系的正确方法。