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 983ca6a
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 0 deletions.
14 changes: 14 additions & 0 deletions lib/default_value_for.rb
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,20 @@ def set_default_values
end
next unless connection_default_value_defined || attribute_blank

attribute_init_value_defined = @initialization_attributes.is_a?(Hash) &&
(
(
@initialization_attributes.has_key?(attribute) &&
@initialization_attributes[attribute].present?
) ||
(
@initialization_attributes.has_key?("#{attribute}_attributes") &&
nested_attributes_options.stringify_keys[attribute].present?
)
)

next if attribute_init_value_defined

# allow explicitly setting nil through allow nil option
next if @initialization_attributes.is_a?(Hash) &&
(
Expand Down
10 changes: 10 additions & 0 deletions test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,11 @@ 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_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 +204,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 983ca6a

Please sign in to comment.