diff --git a/lib/db_charmer.rb b/lib/db_charmer.rb index 5688ec8..2218bfe 100644 --- a/lib/db_charmer.rb +++ b/lib/db_charmer.rb @@ -183,8 +183,19 @@ def on_master(&block) ActiveRecord::Base.extend(DbCharmer::ActiveRecord::DbMagic) # Setup association preload magic -require 'db_charmer/active_record/association_preload' -ActiveRecord::Base.extend(DbCharmer::ActiveRecord::AssociationPreload) +if DbCharmer.rails32? + require 'db_charmer/rails32/active_record/preloader/association' + ActiveRecord::Associations::Preloader::Association.send(:include, DbCharmer::ActiveRecord::Preloader::Association) + require 'db_charmer/rails32/active_record/preloader/has_and_belongs_to_many' + ActiveRecord::Associations::Preloader::HasAndBelongsToMany.send(:include, DbCharmer::ActiveRecord::Preloader::HasAndBelongsToMany) +else + require 'db_charmer/active_record/association_preload' + ActiveRecord::Base.extend(DbCharmer::ActiveRecord::AssociationPreload) + + # Open up really useful API method + ActiveRecord::AssociationPreload::ClassMethods.send(:public, :preload_associations) +end + class ::ActiveRecord::Base class << self diff --git a/lib/db_charmer/rails32/active_record/preloader/association.rb b/lib/db_charmer/rails32/active_record/preloader/association.rb new file mode 100644 index 0000000..d313988 --- /dev/null +++ b/lib/db_charmer/rails32/active_record/preloader/association.rb @@ -0,0 +1,21 @@ +module DbCharmer + module ActiveRecord + module Preloader + module Association + extend ActiveSupport::Concern + included do + alias_method_chain :build_scope, :db_magic + end + + def build_scope_with_db_magic + if model.db_charmer_top_level_connection? || reflection.options[:polymorphic] || + model.db_charmer_default_connection != klass.db_charmer_default_connection + build_scope_without_db_magic + else + build_scope_without_db_magic.on_db(model) + end + end + end + end + end +end diff --git a/lib/db_charmer/rails32/active_record/preloader/has_and_belongs_to_many.rb b/lib/db_charmer/rails32/active_record/preloader/has_and_belongs_to_many.rb new file mode 100644 index 0000000..42f54db --- /dev/null +++ b/lib/db_charmer/rails32/active_record/preloader/has_and_belongs_to_many.rb @@ -0,0 +1,23 @@ +module DbCharmer + module ActiveRecord + module Preloader + module HasAndBelongsToMany + extend ActiveSupport::Concern + included do + alias_method_chain :records_for, :db_magic + end + + def records_for_with_db_magic(ids) + if model.db_charmer_top_level_connection? || reflection.options[:polymorphic] || + model.db_charmer_default_connection != klass.db_charmer_default_connection + records_for_without_db_magic(ids) + else + klass.on_db(model) do + records_for_without_db_magic(ids) + end + end + end + end + end + end +end