From aa73ba7a23044643932b5dbd305570ef5824a30f Mon Sep 17 00:00:00 2001 From: Trevor Turk Date: Wed, 6 May 2026 11:41:33 -0500 Subject: [PATCH] Fix ActiveRecord eager-load isolation --- .github/workflows/_test-matrix.yml | 3 +++ lib/ruby_llm.rb | 6 ++---- lib/ruby_llm/active_record/acts_as.rb | 3 +++ lib/ruby_llm/active_record/acts_as_legacy.rb | 3 +++ lib/ruby_llm/active_record/chat_methods.rb | 2 ++ lib/ruby_llm/active_record/message_methods.rb | 3 +++ lib/ruby_llm/active_record/model_methods.rb | 3 +++ lib/ruby_llm/active_record/payload_helpers.rb | 3 +++ lib/ruby_llm/active_record/tool_call_methods.rb | 3 +++ lib/ruby_llm/railtie.rb | 6 ++++++ spec/ruby_llm/active_record_tool_error_helpers_spec.rb | 2 ++ 11 files changed, 33 insertions(+), 4 deletions(-) diff --git a/.github/workflows/_test-matrix.yml b/.github/workflows/_test-matrix.yml index 54ba562cd..cf1c59cfe 100644 --- a/.github/workflows/_test-matrix.yml +++ b/.github/workflows/_test-matrix.yml @@ -52,6 +52,9 @@ jobs: bundle install bundle exec appraisal ${{ matrix.rails-version }} bundle install + - name: Run eager-load guard (appraisal) + run: bundle exec appraisal ${{ matrix.rails-version }} ruby -e "require 'ruby_llm'; Zeitwerk::Loader.eager_load_all" + - name: Run tests if: matrix.ruby-version != '4.0' || matrix.rails-version != 'rails-8.1' run: bundle exec appraisal ${{ matrix.rails-version }} bin/rspec-queue diff --git a/lib/ruby_llm.rb b/lib/ruby_llm.rb index 87bc94c9d..2ff192d65 100644 --- a/lib/ruby_llm.rb +++ b/lib/ruby_llm.rb @@ -33,6 +33,7 @@ ) loader.ignore("#{__dir__}/tasks") loader.ignore("#{__dir__}/generators") +loader.ignore("#{__dir__}/ruby_llm/active_record") loader.ignore("#{__dir__}/ruby_llm/railtie.rb") loader.setup @@ -107,7 +108,4 @@ def logger RubyLLM::Provider.register :vertexai, RubyLLM::Providers::VertexAI RubyLLM::Provider.register :xai, RubyLLM::Providers::XAI -if defined?(Rails::Railtie) - require 'ruby_llm/railtie' - require 'ruby_llm/active_record/acts_as' -end +require 'ruby_llm/railtie' if defined?(Rails::Railtie) diff --git a/lib/ruby_llm/active_record/acts_as.rb b/lib/ruby_llm/active_record/acts_as.rb index 2dfdbac37..9a5dcd2a9 100644 --- a/lib/ruby_llm/active_record/acts_as.rb +++ b/lib/ruby_llm/active_record/acts_as.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +require 'active_support/concern' +require 'active_support/inflector' + module RubyLLM module ActiveRecord # Adds chat and message persistence capabilities to ActiveRecord models. diff --git a/lib/ruby_llm/active_record/acts_as_legacy.rb b/lib/ruby_llm/active_record/acts_as_legacy.rb index d5b752bd6..48c7fb9d9 100644 --- a/lib/ruby_llm/active_record/acts_as_legacy.rb +++ b/lib/ruby_llm/active_record/acts_as_legacy.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +require 'active_support/concern' +require 'active_support/inflector' + module RubyLLM module ActiveRecord # Adds chat and message persistence capabilities to ActiveRecord models. diff --git a/lib/ruby_llm/active_record/chat_methods.rb b/lib/ruby_llm/active_record/chat_methods.rb index 1175f9000..85e6bd453 100644 --- a/lib/ruby_llm/active_record/chat_methods.rb +++ b/lib/ruby_llm/active_record/chat_methods.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require 'active_support/concern' + module RubyLLM module ActiveRecord # Methods mixed into chat models. diff --git a/lib/ruby_llm/active_record/message_methods.rb b/lib/ruby_llm/active_record/message_methods.rb index 1fc4f20ae..81e52b763 100644 --- a/lib/ruby_llm/active_record/message_methods.rb +++ b/lib/ruby_llm/active_record/message_methods.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +require 'active_support/concern' +require 'ruby_llm/active_record/payload_helpers' + module RubyLLM module ActiveRecord # Methods mixed into message models. diff --git a/lib/ruby_llm/active_record/model_methods.rb b/lib/ruby_llm/active_record/model_methods.rb index e3b10dc8b..0808b021d 100644 --- a/lib/ruby_llm/active_record/model_methods.rb +++ b/lib/ruby_llm/active_record/model_methods.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +require 'active_support/concern' +require 'active_support/core_ext/module/delegation' + module RubyLLM module ActiveRecord # Methods mixed into model registry models. diff --git a/lib/ruby_llm/active_record/payload_helpers.rb b/lib/ruby_llm/active_record/payload_helpers.rb index aa121fc47..b873e1945 100644 --- a/lib/ruby_llm/active_record/payload_helpers.rb +++ b/lib/ruby_llm/active_record/payload_helpers.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +require 'active_support/core_ext/object/blank' +require 'json' + module RubyLLM module ActiveRecord # Shared helpers for parsing serialized payloads on ActiveRecord-backed models. diff --git a/lib/ruby_llm/active_record/tool_call_methods.rb b/lib/ruby_llm/active_record/tool_call_methods.rb index 0d04dcaac..4aefa2ce9 100644 --- a/lib/ruby_llm/active_record/tool_call_methods.rb +++ b/lib/ruby_llm/active_record/tool_call_methods.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +require 'active_support/concern' +require 'ruby_llm/active_record/payload_helpers' + module RubyLLM module ActiveRecord # Methods mixed into tool call models. diff --git a/lib/ruby_llm/railtie.rb b/lib/ruby_llm/railtie.rb index 97a368b06..0b74392cd 100644 --- a/lib/ruby_llm/railtie.rb +++ b/lib/ruby_llm/railtie.rb @@ -12,6 +12,12 @@ class Railtie < Rails::Railtie initializer 'ruby_llm.active_record' do ActiveSupport.on_load :active_record do + require 'ruby_llm/active_record/payload_helpers' + require 'ruby_llm/active_record/chat_methods' + require 'ruby_llm/active_record/message_methods' + require 'ruby_llm/active_record/model_methods' + require 'ruby_llm/active_record/tool_call_methods' + if RubyLLM.config.use_new_acts_as require 'ruby_llm/active_record/acts_as' ::ActiveRecord::Base.include RubyLLM::ActiveRecord::ActsAs diff --git a/spec/ruby_llm/active_record_tool_error_helpers_spec.rb b/spec/ruby_llm/active_record_tool_error_helpers_spec.rb index 975802641..e36285682 100644 --- a/spec/ruby_llm/active_record_tool_error_helpers_spec.rb +++ b/spec/ruby_llm/active_record_tool_error_helpers_spec.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true require 'spec_helper' +require 'ruby_llm/active_record/message_methods' +require 'ruby_llm/active_record/tool_call_methods' RSpec.describe RubyLLM::ActiveRecord do describe RubyLLM::ActiveRecord::MessageMethods do