创建嵌入式文档,似乎没有创建关系

时间:2014-01-17 02:29:39

标签: 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

class BaseStat
  include Mongoid::Document
  embedded_in :character
end

我正在尝试使用具有这些关系的文档播种我的数据库1)因为我必须最终和2)所以我可以测试我正确使用Mongoid。我尝试了几种不同的方法来播种它,但每次,我都可以创建Character文档,然后根据Character文档创建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(名称:值)[0])。但看起来关系没有被存储。

调用a.metadata也会抛出NoMethodError。

我没有设置任何控制器,只有db / seeds.rb中的模型和条目。我觉得我必须遗漏一些基本的东西,因为,我一直在寻找通过StackOverflow并且没有看到任何修复它的东西。

版本: Mongoid 4.0.0.alpha2 Rails 4.0.1

2 个答案:

答案 0 :(得分:2)

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

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

是否会在嵌入BaseStat的情况下打印出您的新记录?如果确实如此,那么种子中的语法或方法一定有问题。

答案 1 :(得分:0)

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

  

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

尝试将autosave: true添加到您的base_stat关系中:

embeds_one :base_stat, autosave: true