如何在数据库中存储不同的用户信息?

时间:2014-02-13 01:23:38

标签: ruby-on-rails ruby activerecord single-table-inheritance

我的第一篇文章:)

我刚刚开始学习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,Coach,Player 。根据该角色,我可以向这些用户授予对某些页面的访问权限。问题是这个表看起来很大,并且会有很多null个值。

例如,如果我创建Coach,则表中的行将具有以下值:

教练[“用户名”,“教练”,“is_enabled”,“firstName”,“lastName”,“password”,“coachRole”,“薪水”,“contractStarted”,“contractEnds”,“vacationDaysLeft” “,null,null,null,null,null,null,null,”created_at“,”updated_at“]

如果我创建Admin,他将拥有以下值:

Admin [“username”,“Admin”,“is_enabled”,“firstName”,“lastName”,“password”,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

但后来我读到我会遇到同样的问题,因为所有这些列都将在每个用户的同一行中。现在我真的不知道如何处理这种情况。我不需要任何额外的宝石进行身份验证和授权。我想亲自去做,尽可能多地学习。

我非常感谢您抽出时间帮我解决这个问题。谢谢。

1 个答案:

答案 0 :(得分:2)

一种解决方案可以将公共部分存储在表“users”中。并创建一个表“属性”。属性表具有“键”,“值”列。您可以在表属性中存储任意属性,例如“coachRole”,“salary”以及您可能希望在将来添加的其他属性(非常可能)。

模型关系可以是:

class User < ActiveRecord::Base 
  has_many :properties
end

class Porperty < ActiveRecord::Base 
  belongs_to :user
end