我在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
答案 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