Calling a method on class creation

I have a model User that has property called status. Status is just a string that can only be evaluated and not persisted. I.e. it doesn't have a field in the user table.

Anyways, I would like a method get_status to be called anytime I create a new instance of User. For example:

user=User.new

Since I created a new instance of User, I should now have access to the status property, e.g.:

user.status =>"Ready"

Here is my User class:

class User < ActiveRecord::Base   has_and_belongs_to_many :roles

def evaluate_status     #evaluate the status     #@status = ...   end end

How would I call get_status whenever a new instance of User is created? It's constructor?

Thanks

initialize or after_initialize should do what you need. Initialize is called by ruby when the object is, well, initialized...

cheers, Dan

It doesn't seem like the initializer gets called when you create a new instance using .find(), e.g.:

c=ContentCampaign.find(1) c.status

=> nill

However, If I create a new instance using new it works, e.g:

d=ContentCampaign.new c.status => Waiting

Here is my class, what's going on?

class ContentCampaign < ActiveRecord::Base   belongs_to :category, :class_name => "Category", :foreign_key => "category_id"

  def initialize    @status= evaluate_status   end

  def evaluate_status     'Waiting'   end

  def status     @status   end

end

eggie5 wrote:

It doesn't seem like the initializer gets called when you create a new instance using .find(), e.g.:

c=ContentCampaign.find(1) c.status

=> nill

However, If I create a new instance using new it works, e.g:

d=ContentCampaign.new c.status => Waiting

Here is my class, what's going on?

class ContentCampaign < ActiveRecord::Base   belongs_to :category, :class_name => "Category", :foreign_key => "category_id"

  def initialize    @status= evaluate_status   end

  def evaluate_status     'Waiting'   end

  def status     @status   end

end

Try instead:

class ContentCampaign < ActiveRecord::Base   belongs_to :category, :class_name => "Category", :foreign_key =>"category_id"

  def evaluate_status     'Waiting'   end

  def status     @status ||= evaluate_status   end end

THANKS! that's the trick I was looking for. Now this reminds me of an example from the essential rails book...

So, it looks like status is called automatically when a new instance of the class is created?

does defining an after_initialize method not work for you?

by the way, your belongs_to method doesn't need the :class_name or :foreign_key specifications.. These can be inferred from the association itself.

Adam

sorry I didn't see you solution till after I tried accessor method.

Regarding the foreign_key and class_name things, rails was warning me that if I could, I should specify them to avoid confusion. Since it was not big deal I just put them in. It's the least I could do for ActiveRecord!