Rails应用程序具有多种用户类型以及如何为数据库建模

时间:2014-10-26 17:05:07

标签: ruby-on-rails ruby-on-rails-4

我已经开始为Rails开发应用程序,但是总有一个问题困扰着我。如果我有多个用户类型并且每个用户都有自己的列,我应该如何建模我的数据库呢?

在我这样简单之前:

create_table "users", force: true do |t|
  t.string   "username"
  t.string   "password"
  t.boolean  "admin",           default: false
  t.boolean  "editor",          default: false
  t.boolean  "publisher",       default: false
  t.boolean  "designer",        default: false
end

当我在View或Controller中需要某些特定用户类型的内容时,我刚检查过用户'中的特定列。 table' true'或者' false'。这足够了,因为用户类型没有任何特定于他们的东西。现在我必须添加许多新列,这些列仅适用于某些用户类型。如果我添加这些列,我会有很多' null'我的用户内部的价值观'表。例如:

create_table "users", force: true do |t|
  t.string   "username"
  t.string   "password"
  t.boolean  "admin_column1"
  t.boolean  "admin_column2"
  t.boolean  "editor_column1"
  t.boolean  "editor_column2"
  t.boolean  "publisher_column1"
  t.boolean  "publisher_column2"
  t.boolean  "designer_column1"
  t.boolean  "designer_column2"
  t.boolean  "admin",           default: false
  t.boolean  "editor",          default: false
  t.boolean  "publisher",       default: false
  t.boolean  "designer",        default: false
end

这意味着,如果我创建的用户是“编辑”,我的表格中会有这样的内容:

  "username": editorUsername
  "password": editorPassword
  "admin_column1": null
  "admin_column2": null
  "editor_column1": editorData1
  "editor_column2": editorData2
  "publisher_column1": null
  "publisher_column2": null
  "designer_column1": null
  "designer_column2": null
  "admin": false
  "editor": true
  "publisher": false
  "designer": false

所以,你可以看到我会有很多' null'每行中的值。处理这种情况的推荐方法是什么?

1 个答案:

答案 0 :(得分:0)

我鼓励您为用户设置角色。创建一个新模型:

rails g model role name:string 

和中间表的迁移:

rails g migration CreateRolesUsers user_id:integer role_id:integer

运行:$ rake db:migrate

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :roles
end

好吧,让我们创建新角色:

Role.create(name: 'admin')
Role.create(name: 'editor')
Role.create(name: 'publisher')
Role.create(name: 'designer')
Role.create(name: 'guest')

新角色很适合分配给用户,例如:

User.find(1).roles << Role.find_by(name: 'admin')

现在,您已经准备好使用cancancan gem来根据您刚刚创建和分配的角色授权用户。这是一个很棒的RailsCasts by Ryan Bates on cancan,可以更好地理解之前的宝石,让它发挥作用。