Это довольно простой случай наследования 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
записей.
Это должно облегчить достижение описанной вами функциональности.