Как мне получить доступ к пользователю с определенной ролью в Rails 3?

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

    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 роли: Designer, Client, Admin, Superuser.

У каждого дизайнера может быть несколько клиентов. Каждый клиент также может принадлежать нескольким дизайнерам.

Итак, я думаю, у меня есть два вопроса:

  1. Если текущий зарегистрированный пользователь (дизайнер) хочет добавить клиента (они могут добавлять только клиентов, никаких других типов пользователей), как мне это сделать? Какой синтаксис я буду использовать в соответствии с моими примерами кода выше. Как только я добавлю клиента, я захочу связать его с проектами, этапами, загрузками и комментариями. Таким образом, теоретически у 1 дизайнера будет несколько проектов, которые будут принадлежать нескольким клиентам.
  2. Как мне затем получить только клиентов для дизайнера, вошедшего в систему. То есть, как мне выбрать всех пользователей с ролью client, связанной с current_user ?

Спасибо.


person marcamillion    schedule 07.01.2011    source источник
comment
Вы имеете в виду, как вы ограничиваете его, чтобы дизайнер мог добавлять только клиента? Я думаю, вы используете declarative_authorization из комментария к другому вопросу, но из этого вопроса это неясно. Кроме того, похоже, что между пользователями не существует связи, которая позволила бы вам добавить пользователя в качестве клиента разработанного, если только это не связано с другими неуказанными ассоциациями. Это может быть только я, но я не чувствую, что здесь достаточно ясности, чтобы ответить на вопрос.   -  person Shadwell    schedule 10.01.2011
comment
По праву Шедуэлла, неуказанных ассоциаций больше нет. Я пытаюсь понять, как развиваться. Что ж, очень хороший вопрос о том, что дизайнер добавляет только клиента. Я работал, исходя из предположения, что любой, кого добавляет дизайнер (то есть любой пользователь), всегда будет иметь роль «клиент». Но нет, это был не вопрос. Вопрос был... учитывая, что пользователи (клиенты) уже были добавлены в проект, принадлежащий другому пользователю (дизайнеру), как мне получить этих пользователей.   -  person marcamillion    schedule 10.01.2011
comment
Итак, идея в том, что у меня есть проект A с 4 пользователями с ролью client. Как мне сделать SELECT * FROM users WHERE role = 'client' & Project = 'A'? Без выполнения каких-либо операторов SQL. В идеале я бы использовал только код Ruby/Rails. Я использую decl_auth и devise для аутентификации. Хотелось бы услышать ваши мысли.   -  person marcamillion    schedule 10.01.2011


Ответы (1)


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

Это довольно прямолинейно:

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