2012-11-11 78 views
1

我想要做的是爲所有用戶設置角色爲「用戶」,但我沒有使用控制檯或Ruby太多,這應該清楚從我的方式,試圖在下面使用它們。爲使用控制檯的所有用戶設置角色

我希望像這樣的工作:

u=User.all 
u.role.name="user" 

但是,很顯然,這不是工作,我不知道如何着手。

我正在CanCan中使用能力模型,並通過角色中的「名稱」列設置角色名稱。用戶必須通過分配

user.rb許多角色

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

這裏的一切是如何設置的:

assignment.rb

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

ability.rb

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # in case of guest 
    if user.has_role? :admin 
     can :manage, :all 
    #else 
    # can :read, :all 
    end 
    end 
end 

ro le.rb

class Role < ActiveRecord::Base 
    attr_accessible :name 
    has_and_belongs_to_many :users, :join_table => :users_roles 
    belongs_to :resource, :polymorphic => true 
end 

角色模式

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

你可以讓我知道我將如何使用控制檯的所有用戶設置的角色叫什麼名字?

回答

2

使用update_all

role = Role.find_by_name 'user' 
User.update_all :role => role 

然而,update_all不會觸發ActiveRecord的回調,所以如果你需要的你,而不是需要遍歷所有用戶:

role = Role.find_by_name 'user' 
User.find_each do |user| 
    user.role = role 
    user.save 
end 

User.find_each負荷用戶分批如果您擁有超過1000個用戶,請儘量減少內存使用量

+1

另外還有#find_each的':batch_size'選項和[#find_in_batches](http://guides.rubyonrails.org/active_record_querying.html#retrieving-multiple-objects-in-batches)方法。 –

+0

我認爲這會工作,但我的角色通過任務分配給用戶「的has_many:角色:通過=>:分配」得到一個錯誤「的ActiveRecord :: StatementInvalid:PG ::錯誤:錯誤:列‘’關係」的作用用戶「不存在」 –

+0

試了第二個建議,看看是否會工作,並得到這個錯誤「NoMethodError:未定義的方法'角色=」爲#<用戶:0x007f8d92894bb8>」 –

相關問題