self[:foo] vs. foo in AR models

I have an ActiveRecord model with a field called default_pic. I can’t figure out why the first example DOES NOT work and the second one does, I’m not sure why I need the self[]
Doesn’t Work
def set_default_pic
default_pic = “d#{(1…8).rand}.gif”
save
end
Works:
def set_default_pic
self[:default_pic] = “d#{(1…8).rand}.gif”
save
end

I have an ActiveRecord model with a field called default_pic. I can't
figure out why the first example DOES NOT work and the second one does

It's a Ruby syntax thing.

def set_default_pic
  default_pic = "d#{(1..8).rand}.gif"
  save
end

That sets a local variable named default_pic. In order to call the
accessor method, you need to do

self.default_pic = "d#{(1..8).rand}.gif"

There's some page in the pickaxe which describes it. I don't have it
beside me, sorry.

Pat

It's also an "ActiveRecord handles attributes with method_missing" thing.

The idiomatic way of doing the same thing would be to use ActiveRecord::Base#update_attribute.

   def set_default_pic
     update_attribute(:default_pic, "d#{(1..8).rand}.gif")
   end

Or, if this is part of a before_create callback, simply:

   def set_default_pic
     write_attribute(:default_pic, "d#{(1..8).rand}.gif")
   end

assuming, of course, that you have defined Range#rand somewhere to be a random item from the Range. (If not, perhaps you want (1+rand(8)) instead.)

-Rob

Rob Biedenharn http://agileconsultingllc.com
Rob@AgileConsultingLLC.com