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