Ruby on rails 创建嵌入式文档,不需要';似乎无法建立关系
我在Rails中使用Mongoid定义了以下模型: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
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确实返回正确的结果。)