我有一个非常奇怪的问题。
这是堆栈:
我运行了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也没有返回正确的数字。
我错过了什么?
答案 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端生成正确的集合。
这些是一些提示,如果我早先知道的话会节省我一些时间......