Mongoid的默认继承方法是为所有子类创建单个集合。例如:
class User
include Mongoid::Document
end
class Admin < User
end
class Guest < User
end
在内部,Mongoid为每个文档添加一个_type
字段,其中包含类名,用于自动将每个实例映射到正确的类。
问题是,如果我在此集合中有一个未知_type
值的文档,我会得到一个例外:
NameError: uninitialized constant UnknownClass
如果您在上面的示例中创建了User
的新子类,并且创建了此新子类的新实例的迁移,则会发生这种情况。在重新启动服务器之前,对此集合的每个查询(如User.all.to_a
)。有没有一种安全的方法来避免这种错误?
我提出的唯一解决方案是抢救所有已知子类的NameError
异常和查询:
class User
def self.some_query(params)
self.where(params).to_a
rescue NameError => e
Rails.logger.error "Unknown subclass: #{e.message}"
subtypes = self.descendants.map(&:to_s)
self.where(params.merge(:_type.in => subtypes)).to_a
end
end