I have an ActiveRecord model called User, here’s my migration and
model:
class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users do |t|
t.column :email, :string, :null => false
t.column :full_name, :string, :null => false
end
end
def self.down
drop_table :users
end
end
class User < ActiveRecord::Base
end
A user has a status. A status is something (a string: “ready”,
“waiting”) that has to be evaluated and cannot be stored to the
database.
My question is about where I should implement the logic (get_status)
to get the user’s status: in the model or the controller? The
controller seems the most logical to me.
I would like to be able to get the status like this, e.g.:
user=User.find(1);
user.status
=> “ready”
So, to implement the above example I would have to have a method
get_status in my user controller? e.g.:
class UsersController < ApplicationController
def show
@user=User.find(1) @user.get_status
render :json => @user.to_json(:include => @status ) # this should
include the status
end
def get_status
“Ready” # hard coding for now…
end
end
So after the call to show I would get a json string back representing
the User, right?
You should a method in the model. Then you can access this method
anywhere you have a User object. If you put it in the controller, you
will have to repeat yourself everytime you want User.status
In your model:
def status
“read” if…
etc.
end
In your controller
def show
@user=User.find(1) #your show view can now read the status method
end
No… do not use after_initialize if you can avoid it. There are huge
performance penalties, as in… it will be called any time you do a .new, or
each time you create an instance. A finder that gets 50 records will call
this code 50 times, and you can’t turn it off. If you look at the rails
source, you’ll see comments basically warning you not to use
after_initialize and after_find.
thanks for the heads up Brian, I wasn’t aware of the performance
penalty that after_initialize might incur.
No… do not use after_initialize if you can avoid it. There are huge
performance penalties, as in… it will be called any time you do a
.new, or
each time you create an instance. A finder that gets 50 records will
call
this code 50 times, and you can’t turn it off. If you look at the rails
source, you’ll see comments basically warning you not to use
after_initialize and after_find.
The best approach is to override the accessor as eggie5 suggested:
def evaluate_status
‘Waiting’
end
def status @status ||= evaluate_status
end
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.