2011-02-24 33 views
0

我想要做的是當一個用戶被創建時,它會自動給他們一個角色。當我的任務與has_many中的用戶模型有關時,如何自動爲用戶分配角色? Rails 3

問題是,角色通過關聯通過分配表和has_many與用戶相關聯。

的代碼如下:

User model 


# == Schema Information 
# Schema version: 20110214082231 
# 
# Table name: users 
# 
# id     :integer   not null, 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) 
# username    :string(255) 
# f_name    :string(255) 
# l_name    :string(255) 
# created_at   :datetime 
# updated_at   :datetime 
# invitation_token  :string(60) 
# invitation_sent_at :datetime 
# plan_id    :integer 
# current_state  :string(255) 
# confirmation_token :string(255) 
# confirmed_at   :datetime 
# confirmation_sent_at :datetime 
# 

class User < ActiveRecord::Base 
    before_create :assign 

    has_many :assignments 
    has_many :roles, :through => :assignments 

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

    def assign 
     @assignment.build_role(:user_id => self.id, :role_id => '3') 
    end 

end 

Assignments model 

# Table name: assignments 
# 
# id   :integer   not null, primary key 
# user_id :integer 
# role_id :integer 
# created_at :datetime 
# updated_at :datetime 
# 

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

Role model 


# == 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 

回答

4

首先,不要使用硬編碼ID來找到你的角色,因爲他們可能會改變。其次,使用關聯構建器,或者只是自己訪問角色關聯。

第三,在命名你的方法時遵循「不要讓我想」(DMMT)的規則。

考慮到這三樣東西:

def assign_default_role 
    self.roles << Role.find_by_name("User") 
end 
相關問題