From 9789b252a8fb9f94233784c73577e086189b8d97 Mon Sep 17 00:00:00 2001 From: fatkodima Date: Fri, 7 Mar 2025 00:25:51 +0200 Subject: [PATCH] incorrect_length_validation: ignore STI models --- .../detectors/incorrect_length_validation.rb | 8 ++++++++ .../detectors/incorrect_length_validation_test.rb | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/lib/active_record_doctor/detectors/incorrect_length_validation.rb b/lib/active_record_doctor/detectors/incorrect_length_validation.rb index 449a9798..fe39dd37 100644 --- a/lib/active_record_doctor/detectors/incorrect_length_validation.rb +++ b/lib/active_record_doctor/detectors/incorrect_length_validation.rb @@ -41,6 +41,9 @@ def detect next if model_maximum == database_maximum next if database_maximum && covered_by_inclusion_validation?(model, column.name.to_sym, database_maximum) + # Add violation only to the root model of STI. + next if (model_maximum.nil? || column.limit.nil?) && sti_subclass?(model) + problem!( model: model.name, column: column, @@ -74,6 +77,11 @@ def covered_by_inclusion_validation?(model, column, limit) values = inclusion_validator.options[:in] || inclusion_validator.options[:within] values.is_a?(Array) && values.all? { |value| value.is_a?(String) && value.size <= limit } end + + def sti_subclass?(model) + model.columns_hash.include?(model.inheritance_column.to_s) && + model.base_class != model + end end end end diff --git a/test/active_record_doctor/detectors/incorrect_length_validation_test.rb b/test/active_record_doctor/detectors/incorrect_length_validation_test.rb index e6f4bd19..f89cbcf4 100644 --- a/test/active_record_doctor/detectors/incorrect_length_validation_test.rb +++ b/test/active_record_doctor/detectors/incorrect_length_validation_test.rb @@ -50,6 +50,20 @@ def test_no_validation_and_limit_is_error OUTPUT end + def test_sti_subclasses_are_ignored + Context.create_table(:users) do |t| + t.string :email, limit: 64 + t.string :type, null: false + end.define_model do + end + + Context.define_model(:Client, Context::User) + + assert_problems(<<~OUTPUT) + the schema limits users.email to 64 characters but there's no length validator on Context::User.email - remove the database limit or add the validator + OUTPUT + end + def test_no_validation_and_no_limit_is_ok require_arbitrary_long_text_columns!