1

埋め込みドキュメントを削除した後、新しい埋め込みドキュメントを追加しようとしています。しかし、使用するとエラーが発生します:

コード

u = User.last
u.classes.destroy_all
u.classes.create(:name => "Philsophy")
=> NoMethodError: undefined method `create' for []:Array

しかし、変数を使用しない場合は機能します。誰かが私にこれを説明してもらえますか? 何百ものアイテムの結果セットをループするには、ネストされた変数バージョンを使用する必要があります。

User.last.classes.destroy_all
User.last.classes.create(:name => "Philsophy")
=> #<Class _id: philosophy, name: "Philosophy"> 

Ruby on Rails 3.0.3
Mongoid 2.0.0.beta.20 (ここでは選択できません)

ありがとう

4

1 に答える 1

0

あなたのモデルがここにあるのか正確にはわかりませんが、次のようなエラーを再現することしかできませんでした:

class User
  include Mongoid::Document

  embeds_many :classes
end

class Class
  include Mongoid::Document
  field :name

  embedded_in :user, :inverse_of => :classes
end

それが問題である場合、問題は、Ruby 標準ライブラリから Class クラスを開き、それを Mongoid モデルに効果的に拡張していることです。意図的ではないと思います。その場合、いくつかのオプションがあります.Classクラスの名前を、標準ライブラリと衝突しない名前に変更するだけです.たとえば、これはうまくいきます:

class User
  include Mongoid::Document

  embeds_many :courses
end

class Course
  include Mongoid::Document
  field :name

  embedded_in :user, :inverse_of => :courses
end

または、クラス「クラス」を本当に呼び出したい場合は、モデルを名前空間に配置できます。

module Models
  class User
    include Mongoid::Document

    embeds_many :classes, :class_name => 'Models::Class'
  end

  class Class
    include Mongoid::Document
    field :name

    embedded_in :user, :inverse_of => :classes, :class_name => 'Models::User'
  end
end

これを行う場合、Mongoid に、class_name. したがって、おそらくクラスの名前を変更するのが最も簡単です。

最初の例のように変数を使用した場合にのみ問題が発生する理由については、destroy_all メソッドがクラス コレクションを壊れた状態のままにしていることが原因であると思われます (名前の衝突の副作用)。2 番目の例では、問題が発生しないように、2 行目で User モデルの新しいインスタンスをロードしています。

于 2012-06-03T09:48:22.087 に答える