Skip to content

Commit

Permalink
Do not overwrite the database default value
Browse files Browse the repository at this point in the history
When a new database record has a column that is set to its database
default value, the "#{attribute}_changed?" method returns false,
which causes default_value_for to overwrite the database default.

This commit changes this behavior to not overwrite when the column
is being set by the initialization attributes.
  • Loading branch information
Reuben Pereira committed Aug 2, 2021
1 parent 0e96e64 commit 78b2524
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 0 deletions.
13 changes: 13 additions & 0 deletions lib/default_value_for.rb
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,19 @@ def set_default_values
end
next unless connection_default_value_defined || attribute_blank

is_present = -> (value) do
if [true, false].include?(value)
!value.nil?
else
value.present?
end
end

attribute_init_value_defined = @initialization_attributes.is_a?(Hash) &&
is_present.call(@initialization_attributes.dig(attribute))

next if attribute_init_value_defined

# allow explicitly setting nil through allow nil option
next if @initialization_attributes.is_a?(Hash) &&
(
Expand Down
16 changes: 16 additions & 0 deletions test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ class ToSql < (Arel::VERSION[/\A\d+/].to_i >= 6 ? Arel::Visitors::Reduce : Arel:
t.string :type
t.integer :number
t.integer :count, :null => false, :default => 1
t.boolean :flag2, :null => false, :default => false
t.integer :user_id
t.timestamp :timestamp
t.text :stuff
Expand Down Expand Up @@ -168,6 +169,16 @@ def test_overwrites_db_default
assert_equal 1234, Book.new.count
end

def test_does_not_overwrite_db_default_if_provided_by_mass_assignment
Book.default_value_for(:count, :allows_nil => false) { 1234 }
assert_equal Book.column_defaults['count'], Book.new(count: Book.column_defaults['count']).count
end

def test_does_not_overwrite_db_default_boolean_value_if_provided_by_mass_assignment
Book.default_value_for(:flag2, :allows_nil => false) { true }
assert_equal Book.column_defaults['flag2'], Book.new(flag2: Book.column_defaults['flag2']).flag2
end

def test_doesnt_overwrite_values_provided_by_mass_assignment
Book.default_value_for :number, 1234
assert_equal 1, Book.new(:number => 1, :count => 2).number
Expand Down Expand Up @@ -199,6 +210,11 @@ def test_overwrites_explicitly_provided_nil_values_in_mass_assignment
assert_equal 1234, Book.new(:number => nil).number
end

def test_overwrites_string_blank_value_in_mass_assignment
Book.default_value_for(:type, :allows_nil => false) { 'string' }
assert_equal 'string', Book.new(type: '').type
end

def test_default_values_are_inherited
Book.default_value_for :number, 1234
assert_equal 1234, Novel.new.number
Expand Down

0 comments on commit 78b2524

Please sign in to comment.