An example of what I\'m talking about:
class Person < ActiveRecord::Base
def name=(name)
super(name.capitalize)
end
def name
super().downcas
Echoing Gareth's comments... your code will not work as written. It should be rewritten this way:
def name=(name)
write_attribute(:name, name.capitalize)
end
def name
read_attribute(:name).downcase # No test for nil?
end
I have a rails plugin that makes attribute overriding work with super as you would expect. You can find it on github.
To install:
./script/plugin install git://github.com/chriseppstein/has_overrides.git
To use:
class Post < ActiveRecord::Base
has_overrides
module Overrides
# put your getter and setter overrides in this module.
def title=(t)
super(t.titleize)
end
end
end
Once you've done that things just work:
$ ./script/console
Loading development environment (Rails 2.3.2)
>> post = Post.new(:title => "a simple title")
=> #<Post id: nil, title: "A Simple Title", body: nil, created_at: nil, updated_at: nil>
>> post.title = "another simple title"
=> "another simple title"
>> post.title
=> "Another Simple Title"
>> post.update_attributes(:title => "updated title")
=> true
>> post.title
=> "Updated Title"
>> post.update_attribute(:title, "singly updated title")
=> true
>> post.title
=> "Singly Updated Title"
As an extension to Aaron Longwell's answer, you can also use a "hash notation" to access attributes that have overridden accessors and mutators:
def name=(name)
self[:name] = name.capitalize
end
def name
self[:name].downcase
end
There is some great information available on this topic at http://errtheblog.com/posts/18-accessor-missing.
The long and short of it is that ActiveRecord does correctly handle super calls for ActiveRecord attribute accessors.