How to initialize an ActiveRecord with values in Rails?

activerecord, ruby-on-rails, ruby-on-rails-3.2

Solution

Your default values should be defined in your Schema when they will apply to ALL records. So

def change
  creates_table :posts do |t|
    t.boolean :published, default: false
    t.string :title
    t.text :content
    t.references :author
    t.timestamps
  end
end

Here, every new Post will have false for published. If you want default values at the object level, it's best to use Factory style implementations:

User.build_admin(params)

def self.build_admin(params)
  user = User.new(params)
  user.admin = true
  user
end

Problem

In plain java I'd use: ``` public User(String name, String email) { this.name = name; this.email = f(email); this.admin = false; } ``` However, I couldn't find a simple standard way to do in rails (3.2.3), with ActiveRecords. 1. override initialize ``` def initialize(attributes = {}, options = {}) @name = attributes[:name] @email = f(attributes[:email]) @admin = false end ``` but it might be missed when creating a record from the DB 2. using the `after_initialize` callback by overriding it: ``` def after_initialize(attributes = {}, options = {}) ... end ``` or with the macro: ``` after_initialize : my_own_little_init def my_own_little_init(attributes = {}, options = {}) ... end ``` but there may be some deprecation issues. There are some other links in SO, but they may be out-of-date. So, what's the correct/standard method to use?

Original source

Related problems