class Rolify::Adapter::ResourceAdapter

Public Instance Methods

all_except(resource, excluded_obj) click to toggle source
# File lib/rolify/adapters/active_record/resource_adapter.rb, line 41
def all_except(resource, excluded_obj)
  prime_key = resource.primary_key.to_sym
  resource.where.not(prime_key => excluded_obj.pluck(prime_key))
end
applied_roles(relation, children) click to toggle source
# File lib/rolify/adapters/active_record/resource_adapter.rb, line 33
def applied_roles(relation, children)
  if children
    relation.role_class.where('resource_type IN (?) AND resource_id IS NULL', self.relation_types_for(relation))
  else
    relation.role_class.where('resource_type = ? AND resource_id IS NULL', relation.to_s)
  end
end
find_roles(role_name, relation, user) click to toggle source
# File lib/rolify/adapters/active_record/resource_adapter.rb, line 6
def find_roles(role_name, relation, user)
  roles = user && (user != :any) ? user.roles : self.role_class
  roles = roles.where('resource_type IN (?)', self.relation_types_for(relation))
  roles = roles.where(:name => role_name.to_s) if role_name && (role_name != :any)
  roles
end
in(relation, user, role_names) click to toggle source
# File lib/rolify/adapters/active_record/resource_adapter.rb, line 28
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)}")
  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)
end
resources_find(roles_table, relation, role_name) click to toggle source
# File lib/rolify/adapters/active_record/resource_adapter.rb, line 13
def resources_find(roles_table, relation, role_name)
  klasses   = self.relation_types_for(relation)
  relations = klasses.inject('') do |str, klass|
    str = "#{str}'#{klass.to_s}'"
    str << ', ' unless klass == klasses.last
    str
  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)})")
  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
end

Private Instance Methods

quote_column(column) click to toggle source
# File lib/rolify/adapters/active_record/resource_adapter.rb, line 48
def quote_column(column)
  ActiveRecord::Base.connection.quote_column_name column
end
quote_table(table) click to toggle source
# File lib/rolify/adapters/active_record/resource_adapter.rb, line 52
def quote_table(table)
  ActiveRecord::Base.connection.quote_table_name table
end