Как получить доступ к пользователю с определенной ролью в Rails 3? - PullRequest
0 голосов
/ 08 января 2011

У меня есть три модели для пользователей. Пользователь, роль и назначения. Вот как выглядят модели:

    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. Если вошедший в систему пользователь (дизайнер) хочет добавить клиента (они могут добавлять только клиентов, без другого типа пользователя), как мне это сделать? Какой синтаксис я буду использовать в соответствии с моими примерами кода выше. После добавления клиента я хочу связать его с проектами, этапами, загрузками и комментариями. Теоретически, у одного дизайнера будет несколько проектов, которые будут принадлежать нескольким клиентам.
  2. Как затем получить только клиентов, для дизайнера, вошедшего в систему. То есть, как выбрать всех пользователей с клиентом роли, связанным с current_user?

Спасибо.

1 Ответ

0 голосов
/ 04 октября 2011

Вопрос был ... учитывая, что пользователи (клиенты) уже были добавлены в проект, принадлежащий другому пользователю (конструктору), как мне получить этих пользователей

Чтодовольно прост:

# Given a project @project = Project.find(id)
@clients = @project.users.joins(:roles).where("roles.name = 'client'")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...