The Rails 5.0 Attributes API provides a default option that makes this gem unnecessary.
Safely initialize an ActiveRecord attribute with respect to missing columns.
Add this line to your application's Gemfile:
gem 'activerecord-safe_initialize'And then execute:
$ bundle
Or install it yourself as:
$ gem install activerecord-safe_initialize
If you want to select subsets of SQL tables, you have to use after_initialize with care:
class Post < ActiveRecord::Base
after_initialize { self.category ||= 'Default' }
end
Post.select([:title, :body, :published_at]).first # => ActiveModel::MissingAttributeErrorTo do this safely you must write:
class Post < ActiveRecord::Base
after_initialize { self.category ||= 'Default' if has_attribute?(:category) }
endWith safe_initialize you can write:
class Post < ActiveRecord::Base
safe_initialize :category, with: 'Default'
endIf with is a Symbol, safe_initialize will send it to self to get the value:
class Post < ActiveRecord::Base
safe_initialize :uuid, with: :generate_uuid
private
def generate_uuid
SecureRandom.uuid
end
endIf with is callable, it will instance_exec it to get the value:
class Post < ActiveRecord::Base
safe_initialize :uuid, with: ->{ SecureRandom.uuid }
endYou can set a default for multiple attributes at once:
class Employee < ActiveRecord::Base
safe_initialize :pay_rate, :holiday_rate, with: 0.0
endOptions are passed through to after_initialize:
safe_initialize :uuid, with: ->{ SecureRandom.uuid }, :if => :new_record?A block can be used instead of :with
safe_initialize :uuid, :if => :new_record? do
SecureRandom.uuid
end- Fork it ( https://github.com/lyconic/activerecord-safe_initialize/fork )
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create a new Pull Request