0

私は本当に奇妙な問題を抱えています。

スタックは次のとおりです。

  • Mongoid 3.0.0
  • Rails3.2.11スタック
  • mongoid_token〜> 1.1.0
  • mongodb2.2.0。

rakeコマンドを実行しましたrake db:mongoid:create_indexesが、インデックスはすべて次のように作成されているようです。

MONGOID: Created indexes on Mongoid::GridFS::Fs::Chunk:
MONGOID: Index: {:files_id=>1, :n=>-1}, Options: {:unique=>true}
MONGOID: Created indexes on Mongoid::GridFS::Fs::File:
MONGOID: Index: {:filename=>1}, Options: {:unique=>true}
...
...
MONGOID: Created indexes on User:
MONGOID: Index: {:token=>1}, Options: {:unique=>true}
...

次に、ユーザーを作成します。

u = User.create!(params)
u.persisted?
 => true

次にmongoシェルを使用すると、何も永続化されていないことがはっきりとわかります。同様に、User.countも正しい数値を返しません。

私は何が欠けていますか?

4

1 に答える 1

2

私は問題を発見しました。これは落とし穴と関係があるので、他の誰かが同様の問題を抱えている場合に備えて投稿したいと思いました。それが私がMongoidを使用していた方法であることがわかりました。

私はそのような基本クラスを持っていました:

class PersistentModel
  include Mongoid::Document
  ..
  # Common class and instance methods that I need across any persistent model
  ..
end

class User < PersistentModel
  # User methods
end

Ruby側からの障害に気付かないので、これは正常に機能することがわかります。すべてが持続します。

しかし、mongodbの終わりを掘り下げると、persistent_modelsコレクションにすべてが永続化されていることがわかります。これは、個別のUserモデルがある場合に期待するものではありません。また、すべてのインデックスが1つのコレクションに対して生成されるため、インデックスに大混乱が発生し、衝突や問題が発生します(つまり、別の症状として、rake db:mongoid:create_indexesコマンドが、を持たないモデルで作成された複数のインデックスを報告します。それらのフィールドで指定されたインデックス)。

解決策はこれを行うことです...

module PersistentModel
  def self.included(base)
    base.instance_eval do
      include Mongoid::Document
      ..
      # Common class and instance methods that I need across any persistent model
      ..          
    end
  end
end

class User
  include PersistentModel
  ..
end

このようにして、Mongoidモデル全体で必要になる可能性のある「共通」メソッドを配置する領域を確保できます。Mongoid:: Documentは実際のモデルクラスにミックスインされ、mongodbの最後に適切なコレクションが生成されます。

便利なトラブルシューティングのヒント

これらは、私が以前に知っていたならば、私にいくらかの時間を節約したであろういくつかの秘訣です...

  1. mongoid.yml構成ファイルのセーフモードをtrueに設定します
    • 私はこれをオンにしていませんでした。これが、根本的なエラーがあったにもかかわらず、保存が成功した理由です。エラーは、値がnilであったため、インデックスを生成できなかったことです。
  2. モンゴシェルを使用して、モンゴイドが持続しているものを確認します
  3. mongoidが生成しているインデックスを確認してください
于 2013-02-27T22:40:55.853 に答える