Sha256: 71b3c9f16398fb2fc0b66d9d2506ac78672f7496f11542d33abcdeb6cfb9c31e

Contents?: true

Size: 1.89 KB

Versions: 3

Compression:

Stored size: 1.89 KB

Contents

class Role < ActiveRecord::Base  
  scope :named, lambda{|role_names| where(:name.in => role_names.flatten)}  
  has_many :users, :through => :user_roles
  has_many :user_roles      
end  

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

module RoleStrategy::ActiveRecord
  module ManyRoles
    def self.default_role_attribute
      :many_roles
    end

    def self.included base
      base.extend Roles::Generic::Role::ClassMethods
      base.extend ClassMethods            
      base.has_many :many_roles, :through => :user_roles, :source => :role
      base.has_many :user_roles    
    end

    module ClassMethods    
      def in_role(role_name)                          
        in_roles(role_name)
      end

      def in_roles(*role_names)                          
        joins(:many_roles) & Role.named(role_names)
      end
    end
    
    module Implementation
      def role_attribute
        strategy_class.roles_attribute_name
      end 
      
      # assign roles
      def roles=(*roles)  
        raise "Role class #{role_class} does not have a #find_role(role) method" if !role_class.respond_to? :find_role
        role_relations = role_class.find_roles(*roles) 
        self.send("#{role_attribute}=", role_relations)
        save
      end

      def add_roles(*roles)  
        raise "Role class #{role_class} does not have a #find_role(role) method" if !role_class.respond_to? :find_role
        role_relations = role_class.find_roles(*roles)
        puts "role_relations: #{role_relations.inspect}"
        self.send(role_attribute) << role_relations
        save
      end

      # query assigned roles
      def roles
        self.send(role_attribute)
      end

      def roles_list     
        [roles].flatten.map{|r| r.name }.compact.to_symbols
      end
    end 
    
    extend Roles::Generic::User::Configuration
    configure :type => :role_class    
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
roles_active_record-0.2.1 lib/roles_active_record/strategy/multi/many_roles.rb
roles_active_record-0.2.0 lib/roles_active_record/strategy/multi/many_roles.rb
roles_active_record-0.1.0 lib/roles_active_record/strategy/multi/many_roles.rb