Как настроить наследование модели в Rails?У меня есть класс и два подкласса - PullRequest
2 голосов
/ 04 марта 2012

Предположим, я создаю блог с определенными типами постов.

У меня есть модель под названием Item.Предмет имеет имя (строку) и ссылку (строку) на источник или что-то еще.Элемент has_and_belongs_to_many: теги (теги - это просто строки, хранящиеся в их собственной базе данных).

Я хочу расширить Предметы на две разные модели: Цитата и Ссылка.

Цитата - это Элемент с некоторымисодержимое (текст), прикрепленный к нему.

Ссылка во многом совпадает с элементом.

И тексты, и ссылки должны иметь имена и ссылки из класса Item, но цитата имеетдополнительное поле (содержание: текст).Я только даю Link подкласс, потому что он не должен рассматриваться как суперкласс Quote.

Я хочу иметь возможность отображать ссылки и цитаты на своих страницах и отображать их по-разному.Я также хочу иметь возможность перечислять все элементы на первой странице и отображать их по-разному (в кавычках должно быть показано их содержание).

Может ли кто-нибудь помочь с этим?

1 Ответ

2 голосов
/ 04 марта 2012

Это довольно простой случай наследования ActiveRecord, и STI (Single Table Inheritance) должен вполне соответствовать вашим потребностям.

Все, что вам действительно нужно сделать, это убедиться, что в вашей таблице items есть все необходимые поля для покрытия каждого из атрибутов его потомков, а также поле типа (строка), которое используется ActiveRecord для внутреннего отслеживания класс каждой записи.

В этом случае, похоже, вам нужно добавить поле содержимого (текст) и поле типа (строка) в таблицу items в базе данных.

Если у вас есть нужные поля, переходите к подклассу Item:

class Quote < Item
  ...
end

и т. Д. И т. П.

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

Я бы добавил show представлений для каждого из подклассов в их собственную папку представлений, например app/views/links, чтобы вы могли по-разному отображать их на своих страницах.

Я бы также добавил партиал app/views/links/_link для каждого из типов, который Rails будет интеллектуально отображать, когда вы, например, вызываете render @item на странице items#index.

# items/index.html.haml
- @items.each do |item|
  = render item

Выше будет отображаться app/views/links/_link.html.haml для Link записей и app/views/quotes/_quote.html.haml для Quote записей.

Это должно облегчить достижение описанной вами функциональности.

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