Наследование Active Record - PullRequest
       5

Наследование Active Record

1 голос
/ 27 января 2010

У меня есть некоторые проблемы в Rails Active Record Inheritance, мне нужно создать модель, которая наследует свойства (поля) родительского класса, а также должна содержать свои собственные свойства.

Ex: Родительский класс

class Content < ActiveRecord::Base
end

Классы, наследующие родительский класс (Content)

class Wiki < Content   // Inherting Class Content
end

class Video < Content   // Inherting Class Content
end

Предположим, что таблица "content" содержит тип поля, имя (для хранения общих полей)

  • Таблица "Wiki" содержит поле body, описание
  • Таблица «Видео» содержит поля имя файла, описание

Вставка в контент и вики-таблицу как

def create
  WikiPage.new("name" =>"new_wikipage")
  @wiki_page = WikiPage.new(params[:wiki_page])
end

но проблема в том, что вновь созданная вики-страница не вставляется (поскольку родительский класс "Content" абстрагирует значения параметров дочернего класса Wikipage)

Генерирующая ошибка, такая как метод «тело» не определен (поле «тело» является частью вики-таблицы, скрытой таблицей содержимого)

Ответы [ 2 ]

2 голосов
/ 27 января 2010

Rails использует наследование одной таблицы (STI) для подклассов модели. Это означает, что вы не создаете отдельную таблицу для Wiki или Video в своей базе данных. Все они будут храниться в таблице «содержимого», и эта таблица должна включать все поля, необходимые для всех подклассов.

Это нормально, если не все подклассы используют все доступные поля. Затем Rails отслеживает, каков подкласс записи, используя столбец «type» родительской таблицы.

Я подробно расскажу об этом в статье под названием Наследование в одной таблице с тестами в Rails . Я думаю, что примеры кода дадут вам лучшее представление о том, как действовать.

1 голос
/ 27 января 2010

Техника, которую вы хотите использовать, называется Наследование одной таблицы . По сути, только модели, которые наследуются непосредственно от ActiveRecord::Base, имеют свою собственную таблицу. В этой таблице должен быть столбец type (обязательно не NULL), в котором хранится имя класса для каждой строки / объекта.

Подробнее об этом можно прочитать в документации Rails API . Я также написал статью о том, когда использовать STI , что может быть полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...