diff --git a/lib/closure_tree/has_closure_tree.rb b/lib/closure_tree/has_closure_tree.rb index b0bc5b1..b83e1fb 100644 --- a/lib/closure_tree/has_closure_tree.rb +++ b/lib/closure_tree/has_closure_tree.rb @@ -11,7 +11,8 @@ def has_closure_tree(options = {}) :dont_order_roots, :numeric_order, :touch, - :with_advisory_lock + :with_advisory_lock, + :database_type ) class_attribute :_ct diff --git a/lib/closure_tree/numeric_order_support.rb b/lib/closure_tree/numeric_order_support.rb index 0223a41..f6a5940 100644 --- a/lib/closure_tree/numeric_order_support.rb +++ b/lib/closure_tree/numeric_order_support.rb @@ -12,6 +12,17 @@ def self.adapter_for_connection(connection) end end + def self.adapter_for_database_type(database_type) + case database_type + when :postgres + ::ClosureTree::NumericOrderSupport::PostgreSQLAdapter + when :mysql + ::ClosureTree::NumericOrderSupport::MysqlAdapter + else + ::ClosureTree::NumericOrderSupport::GenericAdapter + end + end + module MysqlAdapter def reorder_with_parent_id(parent_id, minimum_sort_order_value = nil) return if parent_id.nil? && dont_order_roots diff --git a/lib/closure_tree/support.rb b/lib/closure_tree/support.rb index 75108d7..2878c33 100644 --- a/lib/closure_tree/support.rb +++ b/lib/closure_tree/support.rb @@ -27,7 +27,8 @@ def initialize(model_class, options) }.merge(options) raise ArgumentError, "name_column can't be 'path'" if options[:name_column] == 'path' if order_is_numeric? - extend NumericOrderSupport.adapter_for_connection(connection) + database_type = database_type_from_options || database_type_from_connection + extend NumericOrderSupport.adapter_for_database_type(database_type) end end @@ -170,5 +171,16 @@ def create(model_class, attributes) def create!(model_class, attributes) create(model_class, attributes).tap { |ea| ea.save! } end + + def database_type_from_connection + das = WithAdvisoryLock::DatabaseAdapterSupport.new(connection) + if das.postgresql? + :postgres + elsif das.mysql? + :mysql + else + :generic + end + end end end diff --git a/lib/closure_tree/support_flags.rb b/lib/closure_tree/support_flags.rb index cdf7fd8..928e6e7 100644 --- a/lib/closure_tree/support_flags.rb +++ b/lib/closure_tree/support_flags.rb @@ -31,5 +31,9 @@ def has_inheritance_column?(hash = columns_hash) def has_name? model_class.new.attributes.include? options[:name_column] end + + def database_type_from_options + options[:database_type] + end end end