【问题标题】:Creating embedded documents, doesn't seem to create relationship创建嵌入式文档,似乎没有创建关系
【发布时间】:2014-01-17 02:29:38
【问题描述】:

我在 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 导轨 4.0.1

【问题讨论】:

    标签: ruby-on-rails mongoid


    【解决方案1】:

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

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

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

    【讨论】:

    • 奇怪!确实如此。我目前只有一颗种子。你介意看一下吗? 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))(我改变了字符模型,所以它是 embeds_one :stats,class_name "BaseStat." BaseStat 模型仍然是 embedded_in :character)
    • 假设您已将所有这些字段添加到 BaseStat 模型中,这对我来说似乎是正确的。运行此种子后,您应该能够通过执行 Character.first.stats 找到 BaseStat,这行得通吗?我认为不需要为嵌入式文档存储任何关系数据。它更像是一个伪关联。
    • 不,调用 Character.first.stats 返回 nil。这很奇怪。 (Character.first 确实返回了正确的结果。)
    【解决方案2】:

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

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

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

    embeds_one :base_stat, autosave: true
    

    【讨论】:

      猜你喜欢
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      相关资源
      最近更新 更多