在我的应用中,用户可以属于很多公司,公司可能有很多用户,一个用户可以在两个或更多公司中运营,公司可以有不同的角色,例如公司1用户可能是管理员,公司2可能是秘书。我创建模型公司用户和角色
Company.rb
class Company < ActiveRecord::Base
has_many :users_companies
has_many :users, through: :users_companies
end
User.rb
class User < ActiveRecord::Base
has_many :companies, through: :users_companies
has_many :users_companies
has_many :users_roles, dependent: :destroy
has_many :roles, through: :users_roles
end
Role.rb
class Role < ActiveRecord::Base
has_many :users_roles
has_many :users, through: :users_roles
end
然后我创建模型UsersCompany UsersRole
users_role.rb
class UsersRole < ActiveRecord::Base
belongs_to :user
belongs_to :role
#belongs_to :company
end
Users_role.rb
class UsersRole < ActiveRecord::Base
belongs_to :user
belongs_to :role
#belongs_to :company
end
并添加到users_roles db列company_id以确定用户的公司,但是当我更新用户模型以添加或删除角色时,company_id列将为null。我认为这是一个坏主意,并且有一个正确的解决方案来解决这个问题。
这在我的观点中
<%= form_for([@company, @user]) do |f| %>
<%= f.label :last_name %><br />
<%= f.text_field :last_name %>
<%= f.label :first_name %><br />
<%= f.text_field :first_name, type: "text" %>
<%= f.label :middle_name %><br />
<%= f.text_field :middle_name, type: "text" %>
<%= hidden_field_tag "user[role_ids][]", nil %>
<% Role.all.each do |role| %>
<%= check_box_tag "user[role_ids][]", role.id, @user.role_ids.include?(role.id), id: dom_id(role) %>
<%= label_tag dom_id(role), role.second_name %><br>
<% end %>
<%= f.submit, class: "login loginmodal-submit", type: "submit" %>
<% end %>
和用户控制器更新操作
def update
@company = Company.find(params[:company_id])
@user = User.find(params[:id])
redirect_to :back if @user.update
end
如果用户同时可以在两个角色不同的公司工作,如何构建授权系统?
答案 0 :(得分:0)
我不知道为什么当你更新角色时,company_id变为null,但在你的概念模型中,用户可以在同一家公司担任多个角色,我认为这是错误的。此外,似乎company_user(这是公司和用户之间的基本关系)不必对user_role做任何事情,这使得更新和跟踪哪个用户具有哪个公司的角色。
我想建议那些类模型,以获得用户,角色和公司之间的关系。
class User
has_many :user_roles
has_many :companies, through: :user_roles
end
class Company
has_many :user_roles
has_many :users, through: :user_roles
end
class UserRole
belongs_to :user
belongs_to :company
belongs_to :role
end
class Role
has_many :user_roles
end
我想您知道如何处理迁移。