Keep Defaults

Prevent ActiveRecord attributes for not null
columns with default values from being set to nil
.
Why is this necessary? Take this example:
class OrderItem < ApplicationRecord
end
class Order < ApplicationRecord
has_many :order_items
def total
order_items.sum(&:total) + subtotal + taxes
end
end
The columns have a default value of 0
, but the attributes can still be set to nil
.
This can make for code that is far from bulletproof:
o = Order.new
o.total
o.taxes = nil
o.total
To fix you can do something like:
class OrderItem < ApplicationRecord
def total
super || 0
end
end
class Order < ApplicationRecord
def total
order_items.sum(&:total).to_f + subtotal.to_f + taxes.to_f
end
end
But what about the other contexts in which these can be called or the other attributes you have? This can get tedious.
With Keep Defaults:
class ApplicationRecord < ActiveRecord::Base
include KeepDefaults
end
o = Order.new
o.total
o.taxes = nil
o.total
o.taxes
Now if an attribute is set to nil
it will retain its default value instead.
Installation
Add this line to your application's Gemfile
:
gem "keep_defaults"
Or
gem install keep_defaults
Usage
To use everywhere add to ApplicationRecord
:
class ApplicationRecord < ActiveRecord::Base
include KeepDefaults
end
To use for a specific class add it directly to that class:
class Order < ApplicationRecord
include KeepDefaults
end
License
The gem is available as open source under the terms of the MIT License.