dynamically detect which model adapter to use given a class

This commit is contained in:
Ryan Bates
2010-12-30 14:42:19 -08:00
parent cc30e838c0
commit bbb02f7c8f
9 changed files with 51 additions and 1 deletions
+2 -1
View File
@@ -187,7 +187,8 @@ module CanCan
end
def model_adapter(model_class, action)
ModelAdapters::ActiveRecordAdapter.new(model_class, relevant_rules_for_query(action, model_class))
adapter_class = ModelAdapters::AbstractAdapter.adapter_class(model_class)
adapter_class.new(model_class, relevant_rules_for_query(action, model_class))
end
# See ControllerAdditions#authorize! for documentation.
@@ -1,6 +1,20 @@
module CanCan
module ModelAdapters
class AbstractAdapter
def self.inherited(subclass)
@subclasses ||= []
@subclasses << subclass
end
def self.adapter_class(model_class)
@subclasses.detect { |subclass| subclass.for_class?(model_class) } || DefaultAdapter
end
# Used to determine if the given adapter should be used for the passed in class.
def self.for_class?(member_class)
false # override in subclass
end
def initialize(model_class, rules)
@model_class = model_class
@rules = rules
@@ -1,6 +1,10 @@
module CanCan
module ModelAdapters
class ActiveRecordAdapter < AbstractAdapter
def self.for_class?(model_class)
model_class <= ActiveRecord::Base
end
# Returns conditions intended to be used inside a database query. Normally you will not call this
# method directly, but instead go through ActiveRecordAdditions#accessible_by.
#
@@ -0,0 +1,7 @@
module CanCan
module ModelAdapters
class DefaultAdapter < AbstractAdapter
# This adapter is used when no matching adapter is found
end
end
end