Skip to content

Commit 78b2524

Browse files
author
Reuben Pereira
committed
Do not overwrite the database default value
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.
1 parent 0e96e64 commit 78b2524

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

lib/default_value_for.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,19 @@ def set_default_values
171171
end
172172
next unless connection_default_value_defined || attribute_blank
173173

174+
is_present = -> (value) do
175+
if [true, false].include?(value)
176+
!value.nil?
177+
else
178+
value.present?
179+
end
180+
end
181+
182+
attribute_init_value_defined = @initialization_attributes.is_a?(Hash) &&
183+
is_present.call(@initialization_attributes.dig(attribute))
184+
185+
next if attribute_init_value_defined
186+
174187
# allow explicitly setting nil through allow nil option
175188
next if @initialization_attributes.is_a?(Hash) &&
176189
(

test.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ class ToSql < (Arel::VERSION[/\A\d+/].to_i >= 6 ? Arel::Visitors::Reduce : Arel:
9090
t.string :type
9191
t.integer :number
9292
t.integer :count, :null => false, :default => 1
93+
t.boolean :flag2, :null => false, :default => false
9394
t.integer :user_id
9495
t.timestamp :timestamp
9596
t.text :stuff
@@ -168,6 +169,16 @@ def test_overwrites_db_default
168169
assert_equal 1234, Book.new.count
169170
end
170171

172+
def test_does_not_overwrite_db_default_if_provided_by_mass_assignment
173+
Book.default_value_for(:count, :allows_nil => false) { 1234 }
174+
assert_equal Book.column_defaults['count'], Book.new(count: Book.column_defaults['count']).count
175+
end
176+
177+
def test_does_not_overwrite_db_default_boolean_value_if_provided_by_mass_assignment
178+
Book.default_value_for(:flag2, :allows_nil => false) { true }
179+
assert_equal Book.column_defaults['flag2'], Book.new(flag2: Book.column_defaults['flag2']).flag2
180+
end
181+
171182
def test_doesnt_overwrite_values_provided_by_mass_assignment
172183
Book.default_value_for :number, 1234
173184
assert_equal 1, Book.new(:number => 1, :count => 2).number
@@ -199,6 +210,11 @@ def test_overwrites_explicitly_provided_nil_values_in_mass_assignment
199210
assert_equal 1234, Book.new(:number => nil).number
200211
end
201212

213+
def test_overwrites_string_blank_value_in_mass_assignment
214+
Book.default_value_for(:type, :allows_nil => false) { 'string' }
215+
assert_equal 'string', Book.new(type: '').type
216+
end
217+
202218
def test_default_values_are_inherited
203219
Book.default_value_for :number, 1234
204220
assert_equal 1234, Novel.new.number

0 commit comments

Comments
 (0)