@@ -12,9 +12,9 @@ def where_strict(relation, args)
1212 wrap_conditions = relation . name != role_class . name
1313
1414 conditions = if args [ :resource ] . is_a? ( Class )
15- { :resource_type => args [ :resource ] . to_s , :resource_id => nil }
15+ { :resource_type => resource_base_class ( args [ :resource ] ) , :resource_id => nil }
1616 elsif args [ :resource ] . present?
17- { :resource_type => args [ :resource ] . class . name , :resource_id => args [ :resource ] . id }
17+ { :resource_type => resource_base_class ( args [ :resource ] ) , :resource_id => args [ :resource ] . id }
1818 else
1919 { }
2020 end
@@ -27,7 +27,7 @@ def where_strict(relation, args)
2727
2828 def find_cached ( relation , args )
2929 resource_id = ( args [ :resource ] . nil? || args [ :resource ] . is_a? ( Class ) || args [ :resource ] == :any ) ? nil : args [ :resource ] . id
30- resource_type = args [ :resource ] . is_a? ( Class ) ? args [ :resource ] . to_s : args [ :resource ] . class . name
30+ resource_type = resource_base_class ( args [ :resource ] )
3131
3232 return relation . find_all { |role | role . name == args [ :name ] . to_s } if args [ :resource ] == :any
3333
@@ -40,7 +40,7 @@ def find_cached(relation, args)
4040
4141 def find_cached_strict ( relation , args )
4242 resource_id = ( args [ :resource ] . nil? || args [ :resource ] . is_a? ( Class ) ) ? nil : args [ :resource ] . id
43- resource_type = args [ :resource ] . is_a? ( Class ) ? args [ :resource ] . to_s : args [ :resource ] . class . name
43+ resource_type = resource_base_class ( args [ :resource ] )
4444
4545 relation . find_all do |role |
4646 role . resource_id == resource_id && role . resource_type == resource_type && role . name == args [ :name ] . to_s
@@ -57,7 +57,7 @@ def add(relation, role)
5757
5858 def remove ( relation , role_name , resource = nil )
5959 cond = { :name => role_name }
60- cond [ :resource_type ] = ( resource . is_a? ( Class ) ? resource . to_s : resource . class . name ) if resource
60+ cond [ :resource_type ] = resource_base_class ( resource ) if resource
6161 cond [ :resource_id ] = resource . id if resource && !resource . is_a? ( Class )
6262 roles = relation . roles . where ( cond )
6363 if roles
@@ -83,6 +83,11 @@ def all_except(user, excluded_obj)
8383 user . where . not ( user . primary_key => excluded_obj )
8484 end
8585
86+ def resource_base_class ( resource )
87+ resource_class = resource . is_a? ( Class ) ? resource : resource . class
88+ resource_class . superclass . abstract_class? ? resource_class . to_s : resource_class . superclass . to_s
89+ end
90+
8691 private
8792
8893 def build_conditions ( relation , args )
@@ -110,10 +115,10 @@ def build_query(role, resource = nil)
110115 if resource
111116 query . insert ( 0 , "(" )
112117 query += " OR ((#{ role_table } .name = ?) AND (#{ role_table } .resource_type = ?) AND (#{ role_table } .resource_id IS NULL))"
113- values << role << ( resource . is_a? ( Class ) ? resource . to_s : resource . class . name )
118+ values << role << resource_base_class ( resource )
114119 if !resource . is_a? Class
115120 query += " OR ((#{ role_table } .name = ?) AND (#{ role_table } .resource_type = ?) AND (#{ role_table } .resource_id = ?))"
116- values << role << resource . class . name << resource . id
121+ values << role << resource_base_class ( resource ) << resource . id
117122 end
118123 query += ")"
119124 end
0 commit comments