2014-12-17 3 views
0

Я строю приложение в Ruby On Rails, Rails 4.Как сохранить дополнительные атрибуты, используя однонаправленное наследование?

Скажем, у меня есть таблица Users, и я хочу, чтобы задать два типа пользователей User_1 и User_2

User_1 будет использовать все столбцы из родительской таблицы Users, но User_2 будет использовать все столбцы из таблицы User, например User_1, но для хранения деталей требуется два дополнительных столбца. Вопрос в том, где и как хранятся эти дополнительные данные?

Включены ли столбцы в родительскую таблицу Users? или являются дополнительными атрибутами, закодированными в Model или Controller? Я хочу хранить две части целочисленных данных, которые они будут вводить в свой профиль.

Спасибо, что посмотрели! :)

+0

Я бы обычно использовал STI, где модели имели одинаковые атрибуты, но требовали другого поведения. Если вы обнаружите различие между различными требуемыми атрибутами, лучше всего пойти на две таблицы и модели. –

+0

Если разница ** ** ** заключается в том, что у пользователя User_2 есть дополнительные атрибуты, просто сохраните его в одной модели. Разделение моделей с использованием STI будет иметь смысл только в том случае, если у двух типов пользователей есть методы с одним и тем же именем, но они ведут себя по-разному. – roob

+0

Я считаю, что Roob в этом случае верен. У двух пользователей будет немного другое поведение и функции в приложении, помимо этого только дополнительные атрибуты. Спасибо вам большое за ваш вклад. – RubyMax

ответ

1

Одиночное наследование на основе таблиц в основном означает, что все подклассы User делят единую таблицу базы данных в вашем случае users. Поскольку вам необходимо сохранить данные в базе данных, вам нужно добавить дополнительные столбцы в таблицу users.

more information on STI in the Rails documentation.

+0

Фантастический!Просто чтобы проверить, я предполагаю, что было бы разумно удерживать все значения 'User_1' под этим атрибутом/столбцом как null? Спасибо FiveDigit! :) – RubyMax

+0

Да, вам нужно убедиться, что столбцы могут иметь нулевой (или разумный по умолчанию), чтобы предотвратить ошибки базы данных при сохранении экземпляров 'User_1'. – fivedigit

+1

STI имеет наибольшее значение, если есть хотя бы некоторое совпадение в атрибутах и ​​функциональности. Если они полностью не пересекаются, я бы рассмотрел другие варианты: отдельные модели, смешанное поведение mixin и использование полиморфных ссылок. – nathanvda

0

Дополнительные атрибуты хранятся в родительской таблице User. За сценой STI есть только одна таблица в вашей базе данных с атрибутом type, в котором рассказывается, какие модели следует использовать. Если вы хотите, чтобы унаследованная модель имела некоторые столбцы, она должна быть установлена ​​в вашей родительской модели, т.е. в вашей базе данных.

Дополнительные атрибуты хранятся в базе данных, а ваша модель - это рельсы, чтобы помочь вам получить к ней доступ.

+0

Итак, чтобы определить различия между «пользователями», мне также нужно сохранить значение «String» 'Type' в таблице' User'? – RubyMax

+0

Да, вашей базе данных 'users' потребуется столбец с именем' type' типа string, который будет содержать имя унаследованной модели ('User_1' или' User_2' в вашем примере), чтобы их получить. Взгляните на документ, упомянутый @fivedigit. – mdemolin

0

Это швы, которые вам нужны для упомянутых Single Table Inheritance. Но прежде чем продолжить, я действительно рекомендую вам узнать больше о них. Проверьте это blog post для более теоретического объяснения и того, как и когда его использовать.

Для более полного примера проверьте this example.

Если у вас все еще есть pro acount on railscast, there's one about it.

Смежные вопросы