【问题标题】:How do you create a new embedded document in an existing parent document in mongoid?如何在 mongoid 的现有父文档中创建新的嵌入文档?
【发布时间】:2012-05-30 05:47:22
【问题描述】:

我正在尝试从父文档中删除嵌入文档,然后添加另一个嵌入文档,但出现错误。我的语法不正确吗?

错误

NoMethodError: undefined method `create' for []:Array

代码

u = User.last
u.classes.destroy_all
u.classes.create(:name => "Philsophy") # I get the error right at this line

Ruby on Rails 3.0.3
Mongoid 2.0.0.beta.20

谢谢!

【问题讨论】:

  • 你能给出你的模型结构吗?
  • Mongoid 2.0.0.beta.20 认真的吗?此分支的最新版本是 2.0.2。先尝试升级。

标签: ruby-on-rails mongoid


【解决方案1】:

关系方法 classes 返回一个数组,而不是您的基类。 要创建和嵌入对象,您需要在类上调用 new 方法, 然后将其附加到

这是一个可能与您的意图接近的工作示例。希望它可以帮助您继续前进。

class User
  include Mongoid::Document
  field :name, type: String
  embeds_many :classes, class_name: 'MyClass'
end

class MyClass
  include Mongoid::Document
  field :name, type: String
  embedded_in :user
end

test/unit/user_test.rb

require 'test_helper'

class UserTest < ActiveSupport::TestCase
  def setup
    User.delete_all
  end

  test "embedded doc" do
    User.create(name: 'Gary')
    assert_equal(1, User.count)
    u = User.last
    u.classes.destroy_all
    puts "u.classes.class: #{u.classes.class}"
    u.classes << MyClass.new(:name => 'Philosophy')
    user = User.find(u.id)
    assert_equal('Philosophy', user.classes.first.name)
    puts user.to_json
  end
end

测试输出

Run options: --name=test_embedded_doc

# Running tests:

u.classes.class: Array
{"_id":"4fc62aeb7f11baa5b0000001","classes":[{"_id":"4fc62aeb7f11baa5b0000002","name":"Philosophy"}],"name":"Gary"}
.

Finished tests in 0.009929s, 100.7151 tests/s, 201.4302 assertions/s.

1 tests, 2 assertions, 0 failures, 0 errors, 0 skips

【讨论】:

  • 感谢您的帮助,加里,但这没有用。我发现了如何使它不会出错。请看stackoverflow.com/questions/10823599/…
  • 您没有为“类”提供模型,名称是否是“类”,正如您引用的问题的答案所表明的那样?如果是这样,这是与 Ruby 的 Class 的冲突,它对 Ruby 至关重要,您真的不想重新使用它。
【解决方案2】:

https://mongoid.github.io/old/en/mongoid/v3/relations.html#embeds_many

很有帮助,并指出了许多可以将新对象添加到现有对象的方法,例如:

band.albums.build(name: "Violator")
band.albums.new(name: "Violator")

如果你有多个对象

band.albums.concat(
  Album.new(name: "Violator"),
  Album.new(name: "101")
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    相关资源
    最近更新 更多