Родительское наследование MongoMapper

Я пытаюсь получить лучший и организованный результат использования наследования классов с MongoMapper, но испытывания некоторых затруднений.

class Item
  include MongoMapper::Document

  key :name, String
end

class Picture < Item
  key :url, String
end

class Video < Item
  key :length, Integer
end

Когда я выполняю следующие команды, они не вполне возвращают то, что я ожидаю.

>> Item.all
=> [#]
>> Video.all
=> [#

Они являются всеми одинаковыми результат, я ожидал бы иметь Item.all перечислите все результаты, так включая себя, Picture, и Video. Но если объект на самом деле a Picture, Я хотел бы, чтобы это было возвращено, если бы я работал Picture.all и не, если я работаю Video.all. Вы видите то, что я имею в виду?

Я неправильно понимаю, как наследование работает здесь? Если я - то, что лучший способ состоит в том, чтобы копировать этот вид поведения? Я пытаюсь следовать, это (укажите 2) как инструкция того, как я хочу эту работу. Я предполагаю, что он может работать Link.all найти все ссылки и не включать любой класс, который наследовался Item. Я неправильно?

7
задан Garrett 4 January 2010 в 21:06
поделиться

1 ответ

Пример, на который вы ссылаетесь, немного вводит в заблуждение (или, возможно, его просто трудно понять), поскольку он не показывает полное определение для модели Item . Чтобы использовать наследование в ваших моделях, вам необходимо определить ключ _type в родительской модели. Затем MongoMapper автоматически установит этот ключ на имя класса фактического класса этого документа. Так, например, ваши модели теперь будут выглядеть так:

class Item
  include MongoMapper::Document

  key :name, String
  key :_type, String
end

class Picture < Item
  key :url, String
end

class Video < Item
  key :length, Integer
end

, и результат ваших поисков (при условии, что вы создали объект Picture ) превратится в:

>> Item.all
=> [#<Picture name: "Testing", _type: "Picture", created_at: Sun, 03 Jan 2010 20:02:48 PST -08:00, updated_at: Mon, 04 Jan 2010 13:01:31 PST -08:00, _id: 4b416868010e2a04d0000002, views: 0, user_id: 4b416844010e2a04d0000001, description: "lorem?">]
>> Video.all
=> []
>> Picture.all
=> [#<Picture name: "Testing", _type: "Picture", created_at: Sun, 03 Jan 2010 20:02:48 PST -08:00, updated_at: Mon, 04 Jan 2010 13:01:31 PST -08:00, _id: 4b416868010e2a04d0000002, views: 0, user_id: 4b416844010e2a04d0000001, description: "lorem?">]
10
ответ дан 7 December 2019 в 01:22
поделиться