When do you use 'self' inside of a Model?

I’m a little confused when I should be using ‘self’ in my model.

I had code like:

class User < ActiveRecord::Base

before_save :do_something

def do_something

self.user_bio_text = …

self.user_bio_text

end

end

If I removed ‘self’, it didn’t seem to set the model’s attribute at all (it would return nil).

I can’t recall exaclty where this happenend in my code, but I remember that I was trying to get the a model’s attribute and it didn’t work when I used ‘self.some_attribute’.

So I’m confused, when do I use ‘self’ and when’t don’t I?

I'm a little confused when I should be using 'self' in my model.

I had code like:

class User < ActiveRecord::Base

before_save :do_something

def do_something

self.user_bio_text = .... .. self.user_bio_text end

end

If I removed 'self', it didn't seem to set the model's attribute at all (it would return nil).

Ruby doesn't know whether foo = blah means set the local variable foo or call your foo= accessor method and default to creating the local variable, so if you did want to call the accessor method you need to disambiguate it, with self.foo =

Fred

I’m a little confused when I should be using ‘self’ in my model.

I had code like:

class User < ActiveRecord::Base

before_save :do_something

def do_something

self.user_bio_text = …

self.user_bio_text

end

end

If I removed ‘self’, it didn’t seem to set the model’s attribute at all (it would return nil).

when assigning values to attributes of an instance object, you need to use self, ie self.attribute = something.

if you’re only getting the value of that attribute, no need to add self.

ah I see, this is what I have experienced.

But why is that? Shouldn’t both getting and setting have similiar behaviour?

I think when I was getting a value, using self.attribute wasn’t working, is that the case or was I doing somehting else wrong?

ah I see, this is what I have experienced.

But why is that? Shouldn’t both getting and setting have similiar behaviour?

I think when I was getting a value, using self.attribute wasn’t working, is that the case or was I doing somehting else wrong?

when you want to get a value, you can use self or not but it should return the same value unless, as Fred pointed out, you set

a local variable with the same name as one of the instance object’s attribute where using self.attribute would return the

attribute value, and using attribute (which is also the local variable name) would return the variable value.

ah I see, this is what I have experienced.

But why is that? Shouldn't both getting and setting have similiar behaviour?

I think when I was getting a value, using self.attribute wasn't working, is that the case or was I doing somehting else wrong?

There is the same ambiguity when getting a value, however (unlike when setting) if there is no local variable called foo then ruby can assume that foo means self.foo. If there was such a local variable then you'd need to disambiguate in the same way

Fred

got it.

I just want to understand, why is it different when setting a value, why doesn’t it assume I want self.attribute1 if there was no local variable with the same name e.g. ‘attribute1’.

How would you ever create that attribute1 local variable if the setting assumed it should use self.attribute1 ?! :slight_smile: