Ruby on rails 创建嵌入式文档,不需要';似乎无法建立关系

Ruby on rails 创建嵌入式文档,不需要';似乎无法建立关系,ruby-on-rails,mongoid,Ruby On Rails,Mongoid,我在Rails中使用Mongoid定义了以下模型: Class Character include Mongoid::Document field :n, as: name, type: String field :p, as: :positions, type: Array field :o, as: :roles, type: Array field :r, as: :resource, type: String embeds_one :base_stat end

我在Rails中使用Mongoid定义了以下模型:

Class Character
  include Mongoid::Document
  field :n, as: name, type: String
  field :p, as: :positions, type: Array
  field :o, as: :roles, type: Array 
  field :r, as: :resource, type: String
  embeds_one :base_stat
end

class BaseStat
  include Mongoid::Document
  embedded_in :character
end
我正试图在我的数据库中植入具有这些关系的文档1)因为我最终必须这样做2)这样我才能测试我是否正确使用了Mongoid。我尝试了几种不同的方法来为它种子,但每次,我都可以创建字符文档,然后基于字符文档创建BaseStat文档,但是调用Character.base_stat返回nil

以下是我在db/seeds.rb中尝试过的没有抛出错误的东西:

ch = Character.create!([etc])
ch.build_base_stat([etc])

Character.create!(name: value, name: value, base_stat: BaseStat.new(name: value, name:value))

ch = Character.create!([etc])
ch.create_base_stat([etc])
我也尝试过使用ch.base_stat.create!(当我调用rake db:setup时抛出了一个错误)

我知道Character和BaseStat文档都是创建的,因为我可以在Rails控制台中搜索播种的Character文档(a=Character.where(name:value)[0]和b=BaseStat.where(name:value)[0])。但这段关系似乎没有被储存起来

调用a.metadata也会抛出一个NoMethodError

我没有设置任何控制器,只有模型和db/seeds.rb中的条目。我觉得我一定错过了一些基本的东西,因为我一直在寻找StackOverflow,但还没有看到任何能解决这个问题的东西

版本: Mongoid 4.0.0.2
Rails 4.0.1

您是否尝试过一个非常基本的测试?你能打开rails控制台创建一个角色,保存它,然后添加一个BaseStat并保存它吗

c = Character.new
b = BaseStat.new
b.name = "test"
c.base_stat = b
c.save
c

这会打印出嵌入BaseStat的新记录吗?如果是这样的话,那么seeds中的语法或方法肯定有问题。

引用Mongoid文档,这可能是原因:

从行为的角度来看,Mongoid和Active Record之间的一个核心区别是,Mongoid不会自动为关系关联保存子关系。这是出于性能原因

尝试将
autosave:true
添加到您的
base\u stat
关系:

embeds_one :base_stat, autosave: true

奇怪的是的。我目前只有一颗种子。你介意看一下吗<代码>Character.create!(n:“Aatrox”,p:[“top”,“jungle”]、o:[“offtank”,“glass cannon”]、r:“health”,stats:BaseStat.new(hp:395,hp18:1925,hpr:5.75,hpr18:14.75,ad:55,ad18:112.6,as:0.651,as18:0.983,ar:14,ar18:82.4,mr:30,mr18:52.5,ms:345,r:150))(我更改了字符模型,所以它嵌入了U-one:stats,classā,class名称为“BaseStat”)BaseStat模型仍然嵌入在:character)中,假设您将所有这些字段添加到BaseStat模型中,我认为这是正确的。运行此种子后,您应该能够通过执行Character.first.stats找到BaseStat,这样做有效吗?我认为嵌入式文档不需要存储任何关系数据。它更像是一个伪关联。不,调用Character.first.stats返回nil。这很奇怪。(Character.first确实返回正确的结果。)