Custom init. of ActiveRecord objects - best practices

All,

I’m wanting to initialize an ActiveRecord object.

I understand that there is a method called after_initialize that appears
to get called right after the ActiveRecord object is instantiated.

Is after_initialize a Ruby thing or a Rails thing?
Where is after_initialize documented?
Can I pass parameters to it? If so, how?

I want to initialize the “belongs_to” attribute of my new ActiveRecord
object but can’t figure out how to do it.

Should I just write a standalone public (!) method that will take
whatever parameters I need to set on my new object and then call this
method after my call to Object.new? (I’m not calling Object.create so
before_save is not useful to me here).

In general, what is the best way to perform custom initialization on an
ActiveRecord object?

Thanks,
Wes

Wes G. wrote:

All,

I’m wanting to initialize an ActiveRecord object.

I understand that there is a method called after_initialize that appears
to get called right after the ActiveRecord object is instantiated.

Is after_initialize a Ruby thing or a Rails thing?
Where is after_initialize documented?
Can I pass parameters to it? If so, how?

I want to initialize the “belongs_to” attribute of my new ActiveRecord
object but can’t figure out how to do it.

Should I just write a standalone public (!) method that will take
whatever parameters I need to set on my new object and then call this
method after my call to Object.new? (I’m not calling Object.create so
before_save is not useful to me here).

In general, what is the best way to perform custom initialization on an
ActiveRecord object?

Thanks,
Wes

I suppose that if I want to initialize certain fields to default values,
I have the option of putting login into the appropriate getters to
handle that, but that seems awfully kludgy.

Wes

Based on another post (Adding custom attributes to an ActiveRecord object - Rails - Ruby-Forum), I
think I understand how to handle this.

In order to set the attributes of the job to something custom, you need
to define

def initialize(attributes)
super(attributes)
end

where attributes is a hash keyed by attribute name containing the
default values that you want.

Any further attribute initialization should happen here.

Any initialization of instance variables should probably go into the
after_initialize method (although it seems like you could include that
in the
overridden initialize method as well). there’s no mention of
after_initialize in the API docs. so I’m not sure if it’s ok to use or
not.

Here’s my example - I have two models, Job and Contact. I want to
initialize Job and set it’s Contact to be the current user. Note that
I’m not saving my job yet (so using Job.new, not Job.create).

class Job < ActiveRecord::Base
belongs_to :contact, :foreign_key => ‘ContactNumber’

class Contact < ActiveRecord::Base
has_many :jobs, :foreign_key => ‘ContactNumber’

In my controller, I say:

@current_job = Job.new({ :contact => Contact.find(session[:user]) })

In job.rb, I override the initialize method:

public
def initialize(attributes = nil)
super(attributes)
self.FAX = contact.FAX
self.EMAIL = contact.EMAIL
end

This seems to work. In my case, I didn’t need to do any initialization
except for attributes so I didn’t define the after_initialize method.

Wes