具有多种类型的STI的mongo映射器?

时间:2010-03-15 23:31:00

标签: ruby-on-rails ruby mongodb single-table-inheritance mongomapper

我有一系列模型,都继承自基础模型Properties

例如Bars, Restaurants, Cafes, etc.

class Property
  include MongoMapper::Document

  key :name, String
  key :_type, String
end

class Bar < Property

我想知道的是,如果记录恰好是Bar&amp;一个餐厅?有没有办法让单个对象继承两个模型的属性?它如何使用密钥:_type?

1 个答案:

答案 0 :(得分:2)

我想你想要一个模块。

class Property
  include MongoMapper::Document

  key :name, String
  key :_type, String
end

module Restaurant
  def serve_food
    puts 'Yum!'
  end
end

class Bar < Property
  include Restaurant
end

Bar.new.serve_food # => Yum!

通过这种方式,您可以让许多模型具有餐厅的属性,而无需复制您的代码。

你也可以尝试,虽然我自己没有尝试过,但它是多层次的继承。 e.g:

class Property
  include MongoMapper::Document

  key :name, String
  key :_type, String
end

class Restaurant < Property
  key :food_menu, Hash
end

class Bar < Restaurant
  key :drinks_menu, Hash
end

我不确定MongoMapper是否支持这一点,但我不明白为什么不支持。