【问题标题】:How do I access a user with a specific role in Rails 3?如何在 Rails 3 中访问具有特定角色的用户?
【发布时间】:2011-10-04 18:59:32
【问题描述】:

我为用户提供了三种模型。用户、角色和分配。这就是模型的外观:

    assignment.rb

# == Schema Information
# Schema version: 20101117094659
#
# Table name: assignments
#
#  id         :integer         not null, primary key
#  created_at :datetime
#  updated_at :datetime
#  user_id    :integer
#  role_id    :integer
#

class Assignment < ActiveRecord::Base
    belongs_to :role
    belongs_to :user
end

role.rb

# == Schema Information
# Schema version: 20101117094659
#
# Table name: roles
#
#  id         :integer         not null, primary key
#  name       :string(255)
#  created_at :datetime
#  updated_at :datetime
#

class Role < ActiveRecord::Base
    has_many :assignments
    has_many :users, :through => :assignments
end

user.rb

# == Schema Information
# Schema version: 20110102225945
#
# Table name: users
#
#  id                   :integer         primary key
#  email                :string(255)
#  encrypted_password   :string(128)
#  password_salt        :string(255)
#  reset_password_token :string(255)
#  remember_token       :string(255)
#  remember_created_at  :datetime
#  sign_in_count        :integer
#  current_sign_in_at   :datetime
#  last_sign_in_at      :datetime
#  current_sign_in_ip   :string(255)
#  last_sign_in_ip      :string(255)
#  created_at           :datetime
#  updated_at           :datetime
#  username             :string(255)
#  f_name               :string(255)
#  l_name               :string(255)
#

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable, and :lockable
  devise :database_authenticatable, :registerable, :timeoutable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me

  has_and_belongs_to_many :projects
  has_many :stages
  has_many :uploads
  has_many :comments
  has_many :assignments
  has_many :roles, :through => :assignments

  def role_symbols
    roles.map do |role|
      role.name.underscore.to_sym
    end
  end  
end

在我看来,要为当前用户选择项目,我会这样做:

在我的项目控制器中,我有:

def index
@projects = current_user.projects

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @projects }
end

结束

然后在视图中我这样做:

<% if current_user.projects.exists? %>
                    <div class="data">
                        There are <%= current_user.projects.count %> projects.<br />
                        <table>
                            <% current_user.projects.each do |project| %>
                                <tr class="changer">
                                    <td><%= link_to project.name, project %></td>
                                </tr>
                            <% end %>
                        </table>
                    </div>
                <% else %>
                    <div class="no-data">
                        <%= image_tag('create-project-icon.png') %><br />
                        Create Project
                    </div>      
                <% end %>

用户有 4 个角色:设计师、客户、管理员、超级用户。

每个设计师可以有多个客户。每个客户也可以属于多个设计师。

所以我想我有两个问题:

  1. 如果当前登录的用户(设计师)想要添加客户端(他们只能添加客户端,不能添加其他用户类型),我该怎么做?根据上面的代码示例,我将使用什么语法。添加客户后,我希望将他与项目、阶段、上传和 cmets 相关联。因此,理论上,一位设计师将拥有多个项目,这些项目将属于多个客户。
  2. 然后如何仅检索已登录的设计人员的客户端。即如何选择具有与 current_user 关联的角色 client 的所有用户?

谢谢。

【问题讨论】:

  • 您的意思是如何限制它以使设计师只能添加一个客户?我认为您是在对另一个问题的评论中使用 declarative_authorization ,但从这个问题中并不清楚。此外,用户之间似乎没有关联,除非通过其他未指定的关联,否则您可以将用户添加为设计的客户。可能只有我一个人,但我觉得这里没有足够的清晰度来回答这个问题。
  • 截至右 Shadwell,没有更多未指定的关联。我试图弄清楚如何进步。好吧,关于设计师只添加客户的问题是一个非常好的问题。我的工作假设设计师添加的任何人(即任何用户)都将始终拥有“客户”角色。但不,这不是问题。问题是......鉴于用户(客户)已经添加到另一个用户(设计师)拥有的项目中,我如何检索这些用户。
  • 所以我的想法是,我的项目 A 有 4 个用户和角色客户端。我该怎么做SELECT * FROM users WHERE role = 'client' &amp; Project = 'A'?无需执行任何 SQL 语句。理想情况下,我只会使用 Ruby/Rails 代码。我正在使用 decl_auth & devise 进行身份验证。很想听听你的想法。

标签: ruby-on-rails-3


【解决方案1】:

问题是...鉴于已经添加了用户(客户) 到另一个用户(设计师)拥有的项目,我如何检索 那些用户

这很简单:

# Given a project @project = Project.find(id)
@clients = @project.users.joins(:roles).where("roles.name = 'client'")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2017-09-10
    • 2016-07-13
    • 1970-01-01
    相关资源
    最近更新 更多