From ad8948a3d4265981b01f4b5be4c5908bda632ed4 Mon Sep 17 00:00:00 2001 From: Dovi Winberger Date: Wed, 5 Sep 2018 11:36:44 +0300 Subject: [PATCH 01/11] Update role.rb use config.resource_primary_key to define a field instead of .id --- lib/rolify/role.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rolify/role.rb b/lib/rolify/role.rb index 8e6f4367..7b94dd9f 100644 --- a/lib/rolify/role.rb +++ b/lib/rolify/role.rb @@ -12,7 +12,7 @@ def self.included(base) def add_role(role_name, resource = nil) role = self.class.adapter.find_or_create_by(role_name.to_s, (resource.is_a?(Class) ? resource.to_s : resource.class.name if resource), - (resource.id if resource && !resource.is_a?(Class))) + (resource.send(Rolify.resource_primary_key) if resource && !resource.is_a?(Class))) if !roles.include?(role) self.class.define_dynamic_method(role_name, resource) if Rolify.dynamic_shortcuts From ff6f4e79efa34e83c40d889c8abe131c57b5cf41 Mon Sep 17 00:00:00 2001 From: Dovi Winberger Date: Wed, 5 Sep 2018 11:53:47 +0300 Subject: [PATCH 02/11] Update configure.rb added resource_primary_key --- lib/rolify/configure.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/rolify/configure.rb b/lib/rolify/configure.rb index 96c00c74..191a844f 100644 --- a/lib/rolify/configure.rb +++ b/lib/rolify/configure.rb @@ -3,12 +3,21 @@ module Configure @@dynamic_shortcuts = false @@orm = "active_record" @@remove_role_if_empty = true + @@resource_primary_key = "id" def configure(*role_cnames) return if !sanity_check(role_cnames) yield self if block_given? end + def resource_primary_key + @@resource_primary_key + end + + def resource_primary_key=(resource_primary_key_name) + @@resource_primary_key = resource_primary_key_name + end + def dynamic_shortcuts @@dynamic_shortcuts end From 52667bb9a8e9a11a15bdc3c94126ae8d630902dd Mon Sep 17 00:00:00 2001 From: Dovi Winberger Date: Wed, 5 Sep 2018 11:55:53 +0300 Subject: [PATCH 03/11] update initialiser to support resource_primary_key --- lib/generators/rolify/templates/initializer.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/generators/rolify/templates/initializer.rb b/lib/generators/rolify/templates/initializer.rb index 0d25416d..c156f1d7 100644 --- a/lib/generators/rolify/templates/initializer.rb +++ b/lib/generators/rolify/templates/initializer.rb @@ -7,4 +7,7 @@ # Configuration to remove roles from database once the last resource is removed. Default is: true # config.remove_role_if_empty = false + + # Configuration to the primary key of the resource. Default is: "id" + # config.resource_primary_key = "id" end From f459e15c4803a97be30520195a3dcfc06b82b8a9 Mon Sep 17 00:00:00 2001 From: Dovi Winberger Date: Wed, 5 Sep 2018 12:26:47 +0300 Subject: [PATCH 04/11] support resource_primary_key --- lib/rolify/adapters/active_record/scopes.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rolify/adapters/active_record/scopes.rb b/lib/rolify/adapters/active_record/scopes.rb index 4ec81e57..b57604ee 100644 --- a/lib/rolify/adapters/active_record/scopes.rb +++ b/lib/rolify/adapters/active_record/scopes.rb @@ -17,11 +17,11 @@ def instance_scoped(resource_type = nil) if resource_type.is_a? Class where_conditions = [ "resource_type = ? AND resource_id IS NOT NULL", resource_type.name ] else - where_conditions = [ "resource_type = ? AND resource_id = ?", resource_type.class.name, resource_type.id ] + where_conditions = [ "resource_type = ? AND resource_id = ?", resource_type.class.name, resource_type.send(Rolify.resource_primary_key) ] end end where(where_conditions) end end end -end \ No newline at end of file +end From a8309ddeb511e6881dd8505340a781da883ea358 Mon Sep 17 00:00:00 2001 From: Dovi Winberger Date: Wed, 5 Sep 2018 12:42:45 +0300 Subject: [PATCH 05/11] support resource_primary_key --- lib/rolify/adapters/active_record/role_adapter.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/rolify/adapters/active_record/role_adapter.rb b/lib/rolify/adapters/active_record/role_adapter.rb index 4c670fdc..9ea2b30a 100644 --- a/lib/rolify/adapters/active_record/role_adapter.rb +++ b/lib/rolify/adapters/active_record/role_adapter.rb @@ -13,14 +13,14 @@ def where_strict(relation, args) resource = if args[:resource].is_a?(Class) {class: args[:resource].to_s, id: nil} else - {class: args[:resource].class.name, id: args[:resource].id} + {class: args[:resource].class.name, id: args[:resource].send(Rolify.resource_primary_key)} end relation.where(:name => args[:name], :resource_type => resource[:class], :resource_id => resource[:id]) end def find_cached(relation, args) - resource_id = (args[:resource].nil? || args[:resource].is_a?(Class) || args[:resource] == :any) ? nil : args[:resource].id + resource_id = (args[:resource].nil? || args[:resource].is_a?(Class) || args[:resource] == :any) ? nil : args[:resource].send(Rolify.resource_primary_key) resource_type = args[:resource].is_a?(Class) ? args[:resource].to_s : args[:resource].class.name return relation.find_all { |role| role.name == args[:name].to_s } if args[:resource] == :any @@ -33,7 +33,7 @@ def find_cached(relation, args) end def find_cached_strict(relation, args) - resource_id = (args[:resource].nil? || args[:resource].is_a?(Class)) ? nil : args[:resource].id + resource_id = (args[:resource].nil? || args[:resource].is_a?(Class)) ? nil : args[:resource].send(Rolify.resource_primary_key) resource_type = args[:resource].is_a?(Class) ? args[:resource].to_s : args[:resource].class.name relation.find_all do |role| @@ -52,7 +52,7 @@ def add(relation, role) def remove(relation, role_name, resource = nil) cond = { :name => role_name } cond[:resource_type] = (resource.is_a?(Class) ? resource.to_s : resource.class.name) if resource - cond[:resource_id] = resource.id if resource && !resource.is_a?(Class) + cond[:resource_id] = resource.send(Rolify.resource_primary_key) if resource && !resource.is_a?(Class) roles = relation.roles.where(cond) if roles relation.roles.delete(roles) @@ -113,7 +113,7 @@ def build_query(role, resource = nil) values << role << (resource.is_a?(Class) ? resource.to_s : resource.class.name) if !resource.is_a? Class query += " OR ((#{role_table}.name = ?) AND (#{role_table}.resource_type = ?) AND (#{role_table}.resource_id = ?))" - values << role << resource.class.name << resource.id + values << role << resource.class.name << resource.send(Rolify.resource_primary_key) end query += ")" end From 9cd722512e9a3d6eb574ccf60b69637dbc0d8242 Mon Sep 17 00:00:00 2001 From: Dovi Winberger Date: Wed, 5 Sep 2018 12:46:57 +0300 Subject: [PATCH 06/11] support resource_primary_key --- lib/rolify/adapters/active_record/resource_adapter.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rolify/adapters/active_record/resource_adapter.rb b/lib/rolify/adapters/active_record/resource_adapter.rb index 26487c63..86f77202 100644 --- a/lib/rolify/adapters/active_record/resource_adapter.rb +++ b/lib/rolify/adapters/active_record/resource_adapter.rb @@ -19,7 +19,7 @@ def resources_find(roles_table, relation, role_name) end resources = relation.joins("INNER JOIN #{quote_table(roles_table)} ON #{quote_table(roles_table)}.resource_type IN (#{relations}) AND - (#{quote_table(roles_table)}.resource_id IS NULL OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)})") + (#{quote_table(roles_table)}.resource_id IS NULL OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)}) OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key})") resources = resources.where("#{quote_table(roles_table)}.name IN (?) AND #{quote_table(roles_table)}.resource_type IN (?)", Array(role_name), klasses) resources = resources.select("#{quote_table(relation.table_name)}.*") resources @@ -27,7 +27,7 @@ def resources_find(roles_table, relation, role_name) def in(relation, user, role_names) roles = user.roles.where(:name => role_names).select("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)}").to_a - relation.where("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)} IN (?) AND ((#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)}) OR (#{quote_table(role_class.table_name)}.resource_id IS NULL))", roles) + relation.where("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)} IN (?) AND ((#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)}) OR (#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key}) OR (#{quote_table(role_class.table_name)}.resource_id IS NULL))", roles) end def applied_roles(relation, children) From abced512cbad5c7a64fe374f71233aa8695798b9 Mon Sep 17 00:00:00 2001 From: Dovi Winberger Date: Wed, 5 Sep 2018 14:54:16 +0300 Subject: [PATCH 07/11] fix parentheses --- lib/rolify/adapters/active_record/resource_adapter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rolify/adapters/active_record/resource_adapter.rb b/lib/rolify/adapters/active_record/resource_adapter.rb index 86f77202..c7cdc649 100644 --- a/lib/rolify/adapters/active_record/resource_adapter.rb +++ b/lib/rolify/adapters/active_record/resource_adapter.rb @@ -19,7 +19,7 @@ def resources_find(roles_table, relation, role_name) end resources = relation.joins("INNER JOIN #{quote_table(roles_table)} ON #{quote_table(roles_table)}.resource_type IN (#{relations}) AND - (#{quote_table(roles_table)}.resource_id IS NULL OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)}) OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key})") + (#{quote_table(roles_table)}.resource_id IS NULL OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)} OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key})") resources = resources.where("#{quote_table(roles_table)}.name IN (?) AND #{quote_table(roles_table)}.resource_type IN (?)", Array(role_name), klasses) resources = resources.select("#{quote_table(relation.table_name)}.*") resources From ca533b30053691501efa05ed8e7c330ff2599df4 Mon Sep 17 00:00:00 2001 From: Dovi Winberger Date: Wed, 5 Sep 2018 15:36:20 +0300 Subject: [PATCH 08/11] fix for non existing fields --- lib/rolify/adapters/active_record/resource_adapter.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rolify/adapters/active_record/resource_adapter.rb b/lib/rolify/adapters/active_record/resource_adapter.rb index c7cdc649..8155d552 100644 --- a/lib/rolify/adapters/active_record/resource_adapter.rb +++ b/lib/rolify/adapters/active_record/resource_adapter.rb @@ -19,7 +19,7 @@ def resources_find(roles_table, relation, role_name) end resources = relation.joins("INNER JOIN #{quote_table(roles_table)} ON #{quote_table(roles_table)}.resource_type IN (#{relations}) AND - (#{quote_table(roles_table)}.resource_id IS NULL OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)} OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key})") + (#{quote_table(roles_table)}.resource_id IS NULL OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)} #{"OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key}" if column_exists?(quote_table(relation.table_name), Rolify.resource_primary_key)} )") resources = resources.where("#{quote_table(roles_table)}.name IN (?) AND #{quote_table(roles_table)}.resource_type IN (?)", Array(role_name), klasses) resources = resources.select("#{quote_table(relation.table_name)}.*") resources @@ -27,7 +27,7 @@ def resources_find(roles_table, relation, role_name) def in(relation, user, role_names) roles = user.roles.where(:name => role_names).select("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)}").to_a - relation.where("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)} IN (?) AND ((#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)}) OR (#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key}) OR (#{quote_table(role_class.table_name)}.resource_id IS NULL))", roles) + relation.where("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)} IN (?) AND ((#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)}) #{"OR (#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key})" if column_exists?(quote_table(relation.table_name), Rolify.resource_primary_key)} OR (#{quote_table(role_class.table_name)}.resource_id IS NULL))", roles) end def applied_roles(relation, children) From cf5d74c3e45aca3a362f2c3c48c999ebfe623855 Mon Sep 17 00:00:00 2001 From: Dovi Winberger Date: Wed, 5 Sep 2018 16:06:03 +0300 Subject: [PATCH 09/11] fix for field names --- lib/rolify/adapters/active_record/resource_adapter.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rolify/adapters/active_record/resource_adapter.rb b/lib/rolify/adapters/active_record/resource_adapter.rb index 8155d552..b4547c1e 100644 --- a/lib/rolify/adapters/active_record/resource_adapter.rb +++ b/lib/rolify/adapters/active_record/resource_adapter.rb @@ -19,7 +19,7 @@ def resources_find(roles_table, relation, role_name) end resources = relation.joins("INNER JOIN #{quote_table(roles_table)} ON #{quote_table(roles_table)}.resource_type IN (#{relations}) AND - (#{quote_table(roles_table)}.resource_id IS NULL OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)} #{"OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key}" if column_exists?(quote_table(relation.table_name), Rolify.resource_primary_key)} )") + (#{quote_table(roles_table)}.resource_id IS NULL OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)} #{"OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key}" if quote_table(relation.table_name).constantize.column_names.include? Rolify.resource_primary_key} )") resources = resources.where("#{quote_table(roles_table)}.name IN (?) AND #{quote_table(roles_table)}.resource_type IN (?)", Array(role_name), klasses) resources = resources.select("#{quote_table(relation.table_name)}.*") resources @@ -27,7 +27,7 @@ def resources_find(roles_table, relation, role_name) def in(relation, user, role_names) roles = user.roles.where(:name => role_names).select("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)}").to_a - relation.where("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)} IN (?) AND ((#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)}) #{"OR (#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key})" if column_exists?(quote_table(relation.table_name), Rolify.resource_primary_key)} OR (#{quote_table(role_class.table_name)}.resource_id IS NULL))", roles) + relation.where("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)} IN (?) AND ((#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)}) #{"OR (#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key})" if quote_table(relation.table_name).constantize.column_names.include? Rolify.resource_primary_key} OR (#{quote_table(role_class.table_name)}.resource_id IS NULL))", roles) end def applied_roles(relation, children) From 4b05695ac5ae5211ab27a4db73f323c956e662b8 Mon Sep 17 00:00:00 2001 From: Dovi Winberger Date: Wed, 5 Sep 2018 22:44:07 +0300 Subject: [PATCH 10/11] fix classify a string --- lib/rolify/adapters/active_record/resource_adapter.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rolify/adapters/active_record/resource_adapter.rb b/lib/rolify/adapters/active_record/resource_adapter.rb index b4547c1e..748fca57 100644 --- a/lib/rolify/adapters/active_record/resource_adapter.rb +++ b/lib/rolify/adapters/active_record/resource_adapter.rb @@ -19,7 +19,7 @@ def resources_find(roles_table, relation, role_name) end resources = relation.joins("INNER JOIN #{quote_table(roles_table)} ON #{quote_table(roles_table)}.resource_type IN (#{relations}) AND - (#{quote_table(roles_table)}.resource_id IS NULL OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)} #{"OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key}" if quote_table(relation.table_name).constantize.column_names.include? Rolify.resource_primary_key} )") + (#{quote_table(roles_table)}.resource_id IS NULL OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)} #{"OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key}" if quote_table(relation.table_name).classify.constantize.column_names.include? Rolify.resource_primary_key} )") resources = resources.where("#{quote_table(roles_table)}.name IN (?) AND #{quote_table(roles_table)}.resource_type IN (?)", Array(role_name), klasses) resources = resources.select("#{quote_table(relation.table_name)}.*") resources @@ -27,7 +27,7 @@ def resources_find(roles_table, relation, role_name) def in(relation, user, role_names) roles = user.roles.where(:name => role_names).select("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)}").to_a - relation.where("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)} IN (?) AND ((#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)}) #{"OR (#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key})" if quote_table(relation.table_name).constantize.column_names.include? Rolify.resource_primary_key} OR (#{quote_table(role_class.table_name)}.resource_id IS NULL))", roles) + relation.where("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)} IN (?) AND ((#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)}) #{"OR (#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key})" if quote_table(relation.table_name).classify.constantize.column_names.include? Rolify.resource_primary_key} OR (#{quote_table(role_class.table_name)}.resource_id IS NULL))", roles) end def applied_roles(relation, children) From a895ac865961a7b932f28969f038ef952ecf9cd7 Mon Sep 17 00:00:00 2001 From: Dovi Winberger Date: Wed, 5 Sep 2018 22:54:13 +0300 Subject: [PATCH 11/11] try another fix to constantize --- lib/rolify/adapters/active_record/resource_adapter.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rolify/adapters/active_record/resource_adapter.rb b/lib/rolify/adapters/active_record/resource_adapter.rb index 748fca57..c14d4aa7 100644 --- a/lib/rolify/adapters/active_record/resource_adapter.rb +++ b/lib/rolify/adapters/active_record/resource_adapter.rb @@ -19,7 +19,7 @@ def resources_find(roles_table, relation, role_name) end resources = relation.joins("INNER JOIN #{quote_table(roles_table)} ON #{quote_table(roles_table)}.resource_type IN (#{relations}) AND - (#{quote_table(roles_table)}.resource_id IS NULL OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)} #{"OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key}" if quote_table(relation.table_name).classify.constantize.column_names.include? Rolify.resource_primary_key} )") + (#{quote_table(roles_table)}.resource_id IS NULL OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)} #{"OR #{quote_table(roles_table)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key}" if relation.table_name.classify.constantize.column_names.include? Rolify.resource_primary_key} )") resources = resources.where("#{quote_table(roles_table)}.name IN (?) AND #{quote_table(roles_table)}.resource_type IN (?)", Array(role_name), klasses) resources = resources.select("#{quote_table(relation.table_name)}.*") resources @@ -27,7 +27,7 @@ def resources_find(roles_table, relation, role_name) def in(relation, user, role_names) roles = user.roles.where(:name => role_names).select("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)}").to_a - relation.where("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)} IN (?) AND ((#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)}) #{"OR (#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key})" if quote_table(relation.table_name).classify.constantize.column_names.include? Rolify.resource_primary_key} OR (#{quote_table(role_class.table_name)}.resource_id IS NULL))", roles) + relation.where("#{quote_table(role_class.table_name)}.#{quote_column(role_class.primary_key)} IN (?) AND ((#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{quote_column(relation.primary_key)}) #{"OR (#{quote_table(role_class.table_name)}.resource_id = #{quote_table(relation.table_name)}.#{Rolify.resource_primary_key})" if relation.table_name.classify.constantize.column_names.include? Rolify.resource_primary_key} OR (#{quote_table(role_class.table_name)}.resource_id IS NULL))", roles) end def applied_roles(relation, children)