如何在Mongoid中忽略具有单个集合继承的未知子类?

时间:2014-11-06 13:32:01

标签: mongoid mongoid4

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

0 个答案:

没有答案