这大致是我所拥有的:
我有很多公司拥有许多用户角色:
class Company < ActiveRecord::Base
has_many :roles, :dependent => :destroy
has_many :users, :through => :roles
end
和许多可以通过角色拥有许多公司的用户:
class User < ActiveRecord::Base
has_many :roles, :dependent => :destroy
has_many :comapnies, :through => :roles
end
以及将两者绑定在一起的许多角色:
class Role < ActiveRecord::Base
belongs_to :user
belongs_to :company
end
这里的想法是用户可以通过常用的电子邮件用户名登录,然后分配给每个公司的权限。 Role有一个user_id和company_id键以及一个权限列'user_role'(即guest,user,admin等)。
这是红宝石新手让我失望的地方。当我的用户登录时,我想查询他们有权限的公司,并通过菜单下拉动态切换。因此,他们登录并在'公司A'中活跃,然后他们可以切换到'公司B'。当他们切换时,company_id存储在一个会话变量中(我已经将他们的user_id与一个正常运行的身份验证系统一起存储)。
查询此内容的最佳方式是什么?我有一个user_id,我想检索company_id,company_name,'user_role'等列表,然后使用它来生成一个下拉列表。
我一直在试用Role.Company.etc.etc
的控制台,但似乎无法解决这个问题。当我在PHP / MySQL中执行此操作之前,它将是一个复杂的连接查询。我确信它在Rails中更容易我喷射似乎无法弄明白。
任何帮助将不胜感激。
谢谢,
丹
答案 0 :(得分:0)
您可以通过current_user.companies.uniq
获取用户有权访问的所有公司(针对任何角色)。 uniq
部分只是确保您在列表中没有重复的公司(如果用户有一个公司的多个角色)。
答案 1 :(得分:0)
感谢大家的反馈。这让我看到包括并再次加入。我最后查看了http://railscasts.com/episodes/181-include-vs-joins和Rails API文档并拼凑了这个:
Role.includes(:company).where(:user_id => session[:user_id])
然后我遍历@role,我可以拉出role.role_name和role.company.name等。用User.find(session [:user_id])启动查询会让它复杂化。