0

親ドキュメントから埋め込みドキュメントを削除し、別の埋め込みドキュメントを追加しようとしていますが、エラーが発生します。構文が正しくありませんか?

エラー

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
モンゴイド 2.0.0.beta.20

ありがとう!

4

2 に答える 2

0

リレーションシップメソッドクラスは、基本クラスではなく配列を返します。オブジェクトを作成して埋め込むには、クラスで新しいメソッドを呼び出してから、それをクラスに追加する必要があります。

これはおそらくあなたが意図したものに近い実際の例です。それがあなたが先に進むのを助けることを願っています。

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
于 2012-05-30T14:17:41.233 に答える