From 0cd3cc6780217dc05a4131522a03f9569d73e8cc Mon Sep 17 00:00:00 2001 From: Jon Jensen Date: Sat, 21 Nov 2015 09:46:25 -0700 Subject: [PATCH] bring `dependent: nullify` along to add_foreign_key, fixes #24 --- lib/immigrant.rb | 13 ++++++++++--- test/immigrant_test.rb | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/lib/immigrant.rb b/lib/immigrant.rb index ff6b3cd..bd00647 100644 --- a/lib/immigrant.rb +++ b/lib/immigrant.rb @@ -75,7 +75,7 @@ def model_keys(classes) # Foo.has_many :bars # Foo.has_many :bazzes, :class_name => Bar # we need to make sure everything is legit and see if any of them - # specify :dependent => :delete + # specify :dependent => :delete|:delete_all|:nullify if current_key = foreign_keys[foreign_key.hash_key] if current_key.to_table != foreign_key.to_table || current_key.options[:primary_key] != foreign_key.options[:primary_key] warnings[foreign_key.hash_key] ||= "Skipping #{foreign_key.from_table}.#{foreign_key.options[:column]}: it has multiple associations referencing different keys/tables." @@ -149,6 +149,12 @@ def infer_belongs_to_keys(klass, reflection) ] end + DEPENDENT_MAP = { + :delete => :cascade, + :delete_all => :cascade, + :nullify => :nullify + } + def infer_has_n_keys(klass, reflection) from_table = reflection.klass.table_name to_table = klass.table_name @@ -156,8 +162,9 @@ def infer_has_n_keys(klass, reflection) primary_key = (reflection.options[:primary_key] || klass.primary_key).to_s actions = {} - if [:delete, :delete_all].include?(reflection.options[:dependent]) && !qualified_reflection?(reflection, klass) - actions = {:on_delete => :cascade, :on_update => :cascade} + dependent_action = DEPENDENT_MAP[reflection.options[:dependent]] + if dependent_action && !qualified_reflection?(reflection, klass) + actions = {:on_delete => dependent_action, :on_update => dependent_action} end [ diff --git a/test/immigrant_test.rb b/test/immigrant_test.rb index a0c60e4..feecb36 100644 --- a/test/immigrant_test.rb +++ b/test/immigrant_test.rb @@ -143,6 +143,23 @@ class Book < ActiveRecord::Base; end ) end + test 'has_one :dependent => :nullify should generate a foreign key with :on_delete => :nullify' do + given <<-CODE + class Author < ActiveRecord::Base + has_one :book, :order => "id DESC", :dependent => :nullify + end + class Book < ActiveRecord::Base; end + CODE + + assert_equal( + [foreign_key_definition( + 'books', 'authors', + :column => 'author_id', :primary_key => 'id', :on_delete => :nullify, :on_update => :nullify + )], + infer_keys + ) + end + test 'has_many should generate a foreign key' do given <<-CODE class Author < ActiveRecord::Base @@ -177,6 +194,23 @@ class Book < ActiveRecord::Base; end ) end + test 'has_many :dependent => :nullify should generate a foreign key with :on_delete => :nullify' do + given <<-CODE + class Author < ActiveRecord::Base + has_many :books, :dependent => :nullify + end + class Book < ActiveRecord::Base; end + CODE + + assert_equal( + [foreign_key_definition( + 'books', 'authors', + :column => 'author_id', :primary_key => 'id', :on_delete => :nullify, :on_update => :nullify + )], + infer_keys + ) + end + test 'has_and_belongs_to_many should generate two foreign keys' do given <<-CODE class Author < ActiveRecord::Base