Вопрос

Я пытаюсь получить лучший и организованный результат от использования наследования классов с 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
=> [#<Item name: "Testing", 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
=> [#<Video name: "Testing", 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?">]
>> Picture.all
=> [#<Picture name: "Testing", 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?">]

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

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

Это было полезно?

Решение

Пример, на который вы ссылаетесь, немного вводит в заблуждение (или, возможно, просто труден для понимания), поскольку он не показывает полного определения 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?">]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top