From 0af215ad72f060abdad1790b44f0a136dd97ac38 Mon Sep 17 00:00:00 2001 From: Brett W Green Date: Wed, 31 Aug 2022 14:30:01 -0400 Subject: [PATCH 1/6] use has_many, through --- lib/rolify.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/rolify.rb b/lib/rolify.rb index 6d2f4c16..95806fb6 100644 --- a/lib/rolify.rb +++ b/lib/rolify.rb @@ -24,10 +24,12 @@ def rolify(options = {}) self.role_join_table_name = options[:role_join_table_name] rolify_options = { :class_name => options[:role_cname].camelize } - rolify_options.merge!({ :join_table => self.role_join_table_name }) if Rolify.orm == "active_record" rolify_options.merge!(options.reject{ |k,v| ![ :before_add, :after_add, :before_remove, :after_remove, :inverse_of ].include? k.to_sym }) + join_table_options = { } + join_table_options.merge!(options.reject{ |k,v| ![ :as ].include? k.to_sym }) - has_and_belongs_to_many :roles, **rolify_options + has_many self.role_join_table_name.to_sym, dependent: :destroy, **join_table_options + has_many :roles, through: self.role_join_table_name.to_sym, **rolify_options self.adapter = Rolify::Adapter::Base.create("role_adapter", self.role_cname, self.name) From 12a0a9c64378b918707236c60ad35d6ec951ec42 Mon Sep 17 00:00:00 2001 From: Brett W Green Date: Wed, 31 Aug 2022 15:11:08 -0400 Subject: [PATCH 2/6] proper destroy --- lib/rolify/adapters/active_record/role_adapter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rolify/adapters/active_record/role_adapter.rb b/lib/rolify/adapters/active_record/role_adapter.rb index a1f01fb3..de46c9fb 100644 --- a/lib/rolify/adapters/active_record/role_adapter.rb +++ b/lib/rolify/adapters/active_record/role_adapter.rb @@ -61,7 +61,7 @@ def remove(relation, role_name, resource = nil) cond[:resource_id] = resource.id if resource && !resource.is_a?(Class) roles = relation.roles.where(cond) if roles - relation.roles.delete(roles) + roles = roles.destroy_all roles.each do |role| role.destroy if role.send(ActiveSupport::Inflector.demodulize(user_class).tableize.to_sym).limit(1).empty? end if Rolify.remove_role_if_empty From ed7a23cfbdf7982f2c1afdaacf8e7198365eb675 Mon Sep 17 00:00:00 2001 From: Brett W Green Date: Wed, 31 Aug 2022 15:22:04 -0400 Subject: [PATCH 3/6] destroy the relation --- lib/rolify/adapters/active_record/role_adapter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rolify/adapters/active_record/role_adapter.rb b/lib/rolify/adapters/active_record/role_adapter.rb index de46c9fb..1d27605a 100644 --- a/lib/rolify/adapters/active_record/role_adapter.rb +++ b/lib/rolify/adapters/active_record/role_adapter.rb @@ -61,7 +61,7 @@ def remove(relation, role_name, resource = nil) cond[:resource_id] = resource.id if resource && !resource.is_a?(Class) roles = relation.roles.where(cond) if roles - roles = roles.destroy_all + relation.send(join_table).where(role_id: roles.ids).destroy_all roles.each do |role| role.destroy if role.send(ActiveSupport::Inflector.demodulize(user_class).tableize.to_sym).limit(1).empty? end if Rolify.remove_role_if_empty From 11cc3bf104b09098a1592b56274a5a4f006c65ac Mon Sep 17 00:00:00 2001 From: Brett W Green Date: Wed, 31 Aug 2022 15:55:44 -0400 Subject: [PATCH 4/6] find join table thru reflection --- lib/rolify/adapters/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rolify/adapters/base.rb b/lib/rolify/adapters/base.rb index 373ce6f2..00e94117 100644 --- a/lib/rolify/adapters/base.rb +++ b/lib/rolify/adapters/base.rb @@ -17,7 +17,7 @@ def user_class def role_table role_class.table_name end - + def self.create(adapter, role_cname, user_cname) load "rolify/adapters/#{Rolify.orm}/#{adapter}.rb" load "rolify/adapters/#{Rolify.orm}/scopes.rb" From 9a6472675440e99da43a8446cc2764b2f0001329 Mon Sep 17 00:00:00 2001 From: Brett W Green Date: Wed, 31 Aug 2022 15:58:19 -0400 Subject: [PATCH 5/6] find join table thru reflection --- lib/rolify/adapters/active_record/role_adapter.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rolify/adapters/active_record/role_adapter.rb b/lib/rolify/adapters/active_record/role_adapter.rb index 1d27605a..e6fab5c7 100644 --- a/lib/rolify/adapters/active_record/role_adapter.rb +++ b/lib/rolify/adapters/active_record/role_adapter.rb @@ -61,6 +61,7 @@ def remove(relation, role_name, resource = nil) cond[:resource_id] = resource.id if resource && !resource.is_a?(Class) roles = relation.roles.where(cond) if roles + join_table = relation.class.reflect_on_association(:roles).options[:through] relation.send(join_table).where(role_id: roles.ids).destroy_all roles.each do |role| role.destroy if role.send(ActiveSupport::Inflector.demodulize(user_class).tableize.to_sym).limit(1).empty? From 093fb49cea2e37daef3377c4be49204995f75b96 Mon Sep 17 00:00:00 2001 From: Brett W Green Date: Thu, 1 Sep 2022 13:54:15 -0400 Subject: [PATCH 6/6] fix callbacks --- lib/rolify.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/rolify.rb b/lib/rolify.rb index 95806fb6..2f7e3eed 100644 --- a/lib/rolify.rb +++ b/lib/rolify.rb @@ -24,9 +24,7 @@ def rolify(options = {}) self.role_join_table_name = options[:role_join_table_name] rolify_options = { :class_name => options[:role_cname].camelize } - rolify_options.merge!(options.reject{ |k,v| ![ :before_add, :after_add, :before_remove, :after_remove, :inverse_of ].include? k.to_sym }) - join_table_options = { } - join_table_options.merge!(options.reject{ |k,v| ![ :as ].include? k.to_sym }) + join_table_options = options.select{ |k,v| [ :as, :before_add, :after_add, :before_remove, :after_remove, :inverse_of ].include? k.to_sym } has_many self.role_join_table_name.to_sym, dependent: :destroy, **join_table_options has_many :roles, through: self.role_join_table_name.to_sym, **rolify_options