Module: RoleFu::Resourceable
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/role_fu/resourceable.rb
Defined Under Namespace
Modules: ClassMethods
Instance Method Summary collapse
- #add_role_to_user(user, role_name) ⇒ Object
- #applied_roles ⇒ Object
- #available_roles ⇒ Object
- #count_users_with_role(role_name) ⇒ Object
- #destroy_role(role_name) ⇒ Object
- #has_role?(role_name) ⇒ Boolean
- #remove_role_from_user(user, role_name) ⇒ Object
- #user_has_role?(user, role_name) ⇒ Boolean
- #users_grouped_by_role ⇒ Object
- #users_with_all_roles(*role_names) ⇒ Object
- #users_with_any_role(*role_names) ⇒ Object
- #users_with_role(role_name) ⇒ Object
- #users_with_roles ⇒ Object
Instance Method Details
#add_role_to_user(user, role_name) ⇒ Object
145 146 147 |
# File 'lib/role_fu/resourceable.rb', line 145 def add_role_to_user(user, role_name) user.add_role(role_name, self) end |
#applied_roles ⇒ Object
68 69 70 |
# File 'lib/role_fu/resourceable.rb', line 68 def applied_roles roles end |
#available_roles ⇒ Object
129 130 131 |
# File 'lib/role_fu/resourceable.rb', line 129 def available_roles roles.pluck(:name).uniq end |
#count_users_with_role(role_name) ⇒ Object
137 138 139 |
# File 'lib/role_fu/resourceable.rb', line 137 def count_users_with_role(role_name) users_with_role(role_name).count end |
#destroy_role(role_name) ⇒ Object
72 73 74 |
# File 'lib/role_fu/resourceable.rb', line 72 def destroy_role(role_name) roles.where(name: role_name.to_s).destroy_all end |
#has_role?(role_name) ⇒ Boolean
133 134 135 |
# File 'lib/role_fu/resourceable.rb', line 133 def has_role?(role_name) roles.exists?(name: role_name.to_s) end |
#remove_role_from_user(user, role_name) ⇒ Object
149 150 151 |
# File 'lib/role_fu/resourceable.rb', line 149 def remove_role_from_user(user, role_name) user.remove_role(role_name, self) end |
#user_has_role?(user, role_name) ⇒ Boolean
141 142 143 |
# File 'lib/role_fu/resourceable.rb', line 141 def user_has_role?(user, role_name) user&.has_role?(role_name, self) || false end |
#users_grouped_by_role ⇒ Object
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/role_fu/resourceable.rb', line 76 def users_grouped_by_role RoleFu.role_class.table_name # Efficiently load roles and their associated users # 1. Get all roles for this resource # 2. Preload users for these roles role_scope = roles.includes(:users) results = {} role_scope.each do |role| results[role.name] ||= [] results[role.name].concat(role.users) end # Deduplicate users if a user has the same role multiple times (unlikely with distinct but safer) results.transform_values(&:uniq) end |
#users_with_all_roles(*role_names) ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/role_fu/resourceable.rb', line 109 def users_with_all_roles(*role_names) role_names = role_names.flatten.map(&:to_s) role_table = RoleFu.role_class.table_name user_table = RoleFu.user_class.table_name user_pk = RoleFu.user_class.primary_key RoleFu.user_class.joins(:roles) .where(role_table => {name: role_names, resource_type: self.class.name, resource_id: id}) .group("#{user_table}.#{user_pk}") .having("COUNT(DISTINCT #{role_table}.name) = ?", role_names.size) .distinct end |
#users_with_any_role(*role_names) ⇒ Object
102 103 104 105 106 107 |
# File 'lib/role_fu/resourceable.rb', line 102 def users_with_any_role(*role_names) role_table = RoleFu.role_class.table_name RoleFu.user_class.joins(:roles) .where(role_table => {name: role_names.flatten.map(&:to_s), resource_type: self.class.name, resource_id: id}) .distinct end |
#users_with_role(role_name) ⇒ Object
95 96 97 98 99 100 |
# File 'lib/role_fu/resourceable.rb', line 95 def users_with_role(role_name) role_table = RoleFu.role_class.table_name RoleFu.user_class.joins(:roles) .where(role_table => {name: role_name.to_s, resource_type: self.class.name, resource_id: id}) .distinct end |
#users_with_roles ⇒ Object
122 123 124 125 126 127 |
# File 'lib/role_fu/resourceable.rb', line 122 def users_with_roles role_table = RoleFu.role_class.table_name RoleFu.user_class.joins(:roles) .where(role_table => {resource_type: self.class.name, resource_id: id}) .distinct end |