使用Mongoid创建索引后,模型无法在mongodb中保留

时间:2013-02-27 03:02:21

标签: mongodb ruby-on-rails-3.2 mongoid

我有一个非常奇怪的问题。

这是堆栈:

  • Mongoid 3.0.0
  • Rails 3.2.11 stack
  • mongoid_token~> 1.1.0
  • mongodb 2.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 shell,我可以清楚地看到没有任何内容持续存在。同样,User.count也没有返回正确的数字。

我错过了什么?

1 个答案:

答案 0 :(得分: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结尾,你会发现pers_models集合中的所有东西都是持久的,这不是你所期望的,因为有单独的User模型。它还会对索引造成严重破坏,因为所有索引都是针对一个集合生成的,从而导致冲突和问题(即另一个症状是rake db:mongoid:create_indexes命令将报告在模型上创建的多个索引。 t在这些字段上指定了任何索引。)

解决方案就是这样做......

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

通过这种方式,你仍然可以设置一个区域来共同使用#34;您可能需要跨任何mongoid模型的方法,并将Mongoid :: Document混合到真实模型类中,在mongodb端生成正确的集合。

方便的故障排除提示

这些是一些提示,如果我早先知道的话会节省我一些时间......

  1. 将mongoid.yml配置文件中的安全模式设置为true
    • 我没有这个,这就是为什么保存成功,即使有潜在的错误。错误是索引无法生成,因为该值为nil。
  2. 使用mongo shell并查看mongoid持续存在
  3. 检查mongoid正在生成的索引