3

Мой первый пост :)Как хранить информацию о разных пользователях в базе данных?

Я только начал изучать Rails и имею некоторые сомнения относительно моделирования базы данных. Я создаю сайт для одного футбольного клуба и имею много разных типов пользователей. Каждый пользователь может зайти на сайт и иметь собственную панель управления. Они также хотят, чтобы каждый пользователь имел отдельную часть на сайте для регистрации. Итак, на моем сайте у меня будут ссылки «Зарегистрируйтесь как игрок» и «Зарегистрируйтесь как тренер».

Они будут мои пользователи на сайте и их атрибуты:

SuperAdmin (id, username, firstName, lastName, password) 

Admin (id, username, firstName, lastName, password, is_enabled) 

Coach (id, username, firstName, lastName, password, is_enabled, coachRole, salary, contractStarted, contractEnds, vacationDaysLeft) 

Player (id, username, firstName, lastName, password, is_enables, salary, contactStarted, contractEnds, birthDate, height, weight, goals, assists, minutesPlayed, gamesPlayed) 

Что бы мои варианты здесь?

ВАРИАНТ 1

Я думал о делать что-то вроде этого:

create_table "users", force: true do |t| 
    t.string "username" 
    t.string "userRole" 
    t.boolean "is_enabled" 
    t.string "firstName" 
    t.string "lastName" 
    t.string "password" 
    t.string "coachRole" 
    t.integer "salary" 
    t.datetime "contractStarted" 
    t.datetime "contractEnds" 
    t.integer "vacationDaysLeft" 
    t.datetime "birthDate" 
    t.integer "height" 
    t.integer "weight" 
    t.integer "goals" 
    t.integer "assists" 
    t.integer "minutesPlayed" 
    t.integer "gamesPlayed" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

Колонка UserRole будет иметь значения SuperAdmin, Admin, тренер, игрок. В зависимости от этой роли я могу предоставить доступ к определенным страницам этим пользователям. Проблема в том, что эта таблица выглядит огромной и будет иметь много значений null.

Например, если я создаю тренер, строка в таблице будет иметь следующие значения:

Тренер [ "имя пользователя", "Тренер", "is_enabled", "FirstName", "LastName", «пароль «coachRole», «зарплата», «contractStarted», «contractEnds», «vacationDaysLeft», null, null, null, null, null, null, null, «created_at», «updated_at»]

Я создаю Admin, он будет иметь следующие значения:

Admin ["username", "Admin", "is_enabled", "firstName", "lastName", "pas меч ", null, null, null, null, null, null, null, null, null, null, null, null," created_at "," updated_at "]

Итак, только у игрока действительно будет некоторая польза этот подход.

ВАРИАНТ 2

Во-вторых, я думал сделать, это создать одну «базовую» модель пользователя, которая будет содержать общую информацию:

create_table "users", force: true do |t| 
    t.string "username" 
    t.string "userRole" 
    t.boolean "is_enabled" 
    t.string "firstName" 
    t.string "lastName" 
    t.string "password" 
    t.string "type" 
end 

, а затем для всех других моделей для создания новых моделей :

class SuperAdmin < User 
end 

class Admin < User 
end 

class Coach < User 
end 

class Player < User 
end 

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

Я очень ценю ваше время, помогая мне справиться с этим. Спасибо.

ответ

2

Одним из решений может быть сохранение общей части в таблице «пользователи». И создайте таблицу «Свойства».В таблице свойств есть столбцы «ключ», «значение». Вы можете хранить произвольные свойства в свойствах таблицы, например «coachRole», «зарплата» и другие свойства, которые вы, возможно, захотите добавить в будущем (очень возможно).

Модель отношение может быть:

class User < ActiveRecord::Base 
    has_many :properties 
end 

class Porperty < ActiveRecord::Base 
    belongs_to :user 
end 
+0

Спасибо. Было бы снова несколько нулевых полей, поэтому мне было интересно, что вы думаете, если бы я сделал 2 таблицы вроде этого. Например, CoachProperties и PlayerProperties. Таким образом, я могу легко добавить еще один столбец для каждого свойства, и для добавления новых пользовательских ролей лучше добавить новые роли. Как вы думаете, это будет плохой дизайн? – user3304086

+0

Не должно иметь нулевых полей. То, что я имею в виду, это свойства таблицы, всего 2 столбца, о которых вам нужно позаботиться, «ключ», «значение», ключ может быть «зарплата» или «coachRole», значение может быть «10000» или «некоторая роль». Если у пользователя нет свойства «зарплата», то такой записи в таблице свойств нет. Все столбцы в свойствах таблицы могут быть «id», «key», «value», «user_id». «зарплата» является частью содержания записи, а не колонки. – lalameat

+0

Ага, я понял! Таким образом, таблица свойств будет содержать только эти столбцы: id, ключ и значение. Затем после каждого пользовательского регистра я создавал бы определенные свойства. То, что я не понимаю, так это то, как я покажу это в форме для регистрации. Если у меня будет form_for @user, как будут обрабатываться эти свойства? Они не будут видны. – user3304086

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