我已经开始为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'每行中的值。处理这种情况的推荐方法是什么?
答案 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,可以更好地理解之前的宝石,让它发挥作用。