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::MissingAttributeError
To do this safely you must write:
class Post < ActiveRecord::Base
after_initialize { self.category ||= 'Default' if has_attribute?(:category) }
end
With safe_initialize
you can write:
class Post < ActiveRecord::Base
safe_initialize :category, with: 'Default'
end
If 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
end
If with
is callable, it will instance_exec
it to get the value:
class Post < ActiveRecord::Base
safe_initialize :uuid, with: ->{ SecureRandom.uuid }
end
You can set a default for multiple attributes at once:
class Employee < ActiveRecord::Base
safe_initialize :pay_rate, :holiday_rate, with: 0.0
end
Options 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