2011-01-07 7 views
0

私は3つのモデルがあります。ユーザー、ロール&割り当て。私はこれを行う、現在のユーザーのためのプロジェクトを選択するために、私の見解では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 %> 
:次にビューで、私はこれを行う

を終了

ユーザーには、Designer、Client、Admin、Superuserの4つの役割があります。

各デザイナーは複数のクライアントを持つことができます。各クライアントは複数の設計者に属することもできます。

は、だから私は、私は二つの質問があると思い:現在ログインしているユーザー(デザイナー)は(彼らは唯一、他のユーザータイプをクライアントを追加することはできません)クライアントを追加したい場合は

  1. を、どのように私はやりますそれ?上記のコードサンプルで使用する構文は何ですか?クライアントを追加すると、彼をプロジェクト、ステージ、アップロード、コメントに関連付けることになります。理論的には、1人のデザイナーが複数のプロジェクトに所属し、複数のクライアントに所属します。
  2. ログインしているデザイナーのクライアントのみを取得するにはどうすればいいですか?つまり、current_userに関連付けられた役割クライアントを持つすべてのユーザーを選択するにはどうすればよいですか?

ありがとうございます。

+0

デザイナーがクライアントを追加できるようにするにはどうすればいいですか?私は別の質問のコメントからdeclarative_authorizationを使用していると思いますが、この質問からは明らかではありません。また、他の不特定の関連を経由しない限り、ユーザーを設計のクライアントとして追加することを許可するユーザー間の関連はないようです。それはちょうど私かもしれないが、質問に答えるのに十分な明快さがあるようには感じない。 – Shadwell

+0

右のShadwellの時点で、不特定の関連はありません。進歩する方法を見つけようとしています。まあ、デザイナーがクライアントを追加することについての質問は非常に良いものです。デザイナーが追加するユーザー(つまり、任意のユーザー)が常に「クライアント」という役割を持つという前提のもとで作業していました。しかし、それは疑問ではありませんでした。問題は...ユーザー(クライアント)が別のユーザー(デザイナー)が所有するプロジェクトに既に追加されている場合、それらのユーザーを取得するにはどうすればいいですか? – marcamillion

+0

それでは、私はプロジェクトAに4人のユーザーとロールクライアントを持っています。 'SELECT * FROM users WHERE role = 'client'&Project = 'A''をどうすればいいですか? SQL文を一切実行することなく理想的には、Ruby/Railsコードのみを使用します。私は、認証のためにdecl_auth&deviseを使用しています。あなたの考えを聞くのが大好きです。 – marcamillion

答えて

0

質問は...ユーザー(クライアント)が、すでに私は それらのユーザー

取得んか、別のユーザ(設計者)が所有するプロジェクトに を追加されていることを与えられていますかなりまっすぐ進む:

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

あなたの試行に成功しましたか? – charlysisto

関連する問題