Ruby-newbie Active Record查询/模型关联

时间:2012-03-18 20:38:34

标签: ruby-on-rails-3 activerecord

这大致是我所拥有的:

我有很多公司拥有许多用户角色:

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中更容易我喷射似乎无法弄明白。 任何帮助将不胜感激。

谢谢,

2 个答案:

答案 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])启动查询会让它复杂化。