If I have a RoR model person.rb as follows:
class Person < ActiveRecord::Base
attr_accessible :first_name, :last_name
validates :first_name, presence: true
validates :last_name, presence: true
end
I don’t seem to be able to do any of the below:
@full_name = @first_name + " " + @last_name
or
def full_name
@first_name + " " + @last_name
end
To my understanding, both of those should work with a regular ruby class.
I did a bit of reading and the below seems to be the way to go:
def full_name
self.first_name + " " + self.last_name
end
I can make this work but I really would like to understand why I can’t seem to be able to reference instance variables in any way (nor create new ones).
Does ActiveRecord::Base do something extremely funny to instance variables? Does it limit a model (class Person in this case) to be nothing more then just a wrapper around what’s in the DB?
I can’t seem to define an attr_accessor either… but I can set first_name and last_name just fine (not only via mass assignment but also p = Person.new; p.first_name = foo)
If anyone could please shed some light on this that would be greatly appreciated.
Many thanks,
ActiveRecord model attributes are stored in an instance variable called
@attributes, which is a hash. The getters and setters are defined for you to access this variable.By the way, this is the recommended way to concatenate strings in Ruby:
There is a built-in “to_s” method (on most objects) that will allow you to insert them directly into strings this way. While you couldn’t do this:
"string " + 1without raising an error, you can do this:"string #{1}"