diff --git a/active_record_doctor.gemspec b/active_record_doctor.gemspec index f9aa783..986f0f5 100644 --- a/active_record_doctor.gemspec +++ b/active_record_doctor.gemspec @@ -29,5 +29,5 @@ Gem::Specification.new do |s| s.add_development_dependency "rake", "~> 13.2.1" s.add_development_dependency "rubocop", "~> 1.68.0" s.add_development_dependency "sqlite3", "~> 2.2.0" - s.add_development_dependency "transient_record", "~> 2.0.0" + s.add_development_dependency "transient_record", "~> 3.0.0" end diff --git a/lib/active_record_doctor/detectors/missing_non_null_constraint.rb b/lib/active_record_doctor/detectors/missing_non_null_constraint.rb index 57498f5..63bfc4b 100644 --- a/lib/active_record_doctor/detectors/missing_non_null_constraint.rb +++ b/lib/active_record_doctor/detectors/missing_non_null_constraint.rb @@ -34,9 +34,11 @@ def message(column:, table:) def detect table_models = models.select(&:table_exists?).group_by(&:table_name) + views = connection.views table_models.each do |table, models| next if ignored?(table, config(:ignore_tables)) + next if views.include?(table) concrete_models = models.reject do |model| model.abstract_class? || sti_base_model?(model) diff --git a/test/active_record_doctor/detectors/missing_non_null_constraint_test.rb b/test/active_record_doctor/detectors/missing_non_null_constraint_test.rb index 4cb9fe7..675a017 100644 --- a/test/active_record_doctor/detectors/missing_non_null_constraint_test.rb +++ b/test/active_record_doctor/detectors/missing_non_null_constraint_test.rb @@ -259,6 +259,24 @@ def test_not_null_check_constraint refute_problems end + def test_views_are_ignored + Context.create_table(:old_comments, force: true) do |t| + t.integer :user_id + end + + Context.execute(<<-SQL) + CREATE VIEW comments AS SELECT * FROM old_comments + SQL + + Context.define_model(:Comment) do + belongs_to :user, required: true + end + + refute_problems + ensure + Context.execute("DROP VIEW comments") + end + def test_config_ignore_tables Context.create_table(:users) do |t| t.string :name, null: true