Как поле: type заполняется в наследовании одной таблицы? - PullRequest
2 голосов
/ 30 ноября 2010

Ранее я задавал вопрос о том, как структурировать данные в простом приложении, которое я создаю для управления контентом. Ответ должен был посмотреть на Single Table Inheritance , и я думаю, что это будет билет.

Я прочитал довольно много примеров, но одна вещь, которая, кажется, всегда не учитывается, это то, как фактически заполняется столбец: type? Нужно ли включать поле формы с раскрывающимся списком, чтобы пользователь мог выбирать типы?

Полагаю, я полностью понимаю, как теперь работает STI (поле типа берет имя класса), но мне все еще не хватает чего-то очень простого (и, вероятно, очень очевидного, но я его упускаю). Может кто-нибудь заполнить меня?

У меня есть таблица содержания, например:

id
type
name
desc

И разными типами будут «Сайт», «Блог», «Фото».

Ответы [ 2 ]

6 голосов
/ 30 ноября 2010

Предполагается, что вы храните всю информацию "Сайт", "Блог", "Фото" в таблице содержание . Когда вы инициируете какой-либо объект с помощью Content.new, ему не присваивается никакого значения полю типа.

Но если вы инициируете какой-либо класс из «Сайта», «Блога» или «Фото», который фактически унаследован от модели «Контент», Site.new или Site.create, затем автоматически присваивает имя модели (в данном случае - Site) в поле типа

Аналогично, если вы сделаете Blog.new, он назначит Блог в столбце типа и т. Д.

1 голос
/ 30 ноября 2010

@ jyoseph, да, ты абсолютно прав.Вы можете добавить раскрывающийся список в вашем новом и редактируемом представлении, в котором будут содержаться типы, в вашем случае «Сайт», «Блог», «Фото».Вы также можете сделать помощника в своем файле Application Helper следующим образом

def content_type
   return ["Site", "Blog", "Photo"]
end

, а затем в вашем содержимом / new.html.erb вы можете сделать

<p>
    <%= f.label :type %><br />
    <%= f.select :type, content_type %>
</p>

Попробуйте, это можетработа.

На всякий случай, если кто-то захочет узнать больше о посещении ИППП мой блог

...