This whole situation is a mess, but I'll see if I can explain it well. I have two models, User and Company. I'd like user to be able to get company.name. I'm aware of the problems with using @user.company.name, because of company is nil, then name throws an error. So originally, I wrote this method instead class User def company_name company ? company.name : nil end end This works, however, rather than use that, I would like to use delegation. The problem I ran into with that, however, is that user also has a name. So I can't simply write class User delegate :name, :to => :company end because that will overwrite name. It would be nice if there was a delegate :company_name, :as => :name, :to => :company, but as far as I know this doesn't exist. So... I thought I would use "delegate :company_name: to => :company", and alias :company_name to :name within company, like so: class Company alias :company_name :name end however, that will not work with Active Record models, because name is not defined until the class is instantiated. I could just write a wrapper method, aka def class_name; name; end; but that adds an extra method call that I'd rather not have. So finally, I came up with this solution: class Company def company_name name self.class.class_eval do alias_method :company_name, :name end name end end This works, because the first time company_name is called, it calls name to instantiate it (needed the first call for some reason), then it opens the class and aliases company_name to name. Lastly, it returns name, so that it works as intended on the first call as well. This code does work, I have tested it, but it seems like an awful lot of work for what seems like a simple concept. Maybe I'm just making things too complicated, and should have simply used my company_name method within User, I don't know. If anyone can suggest a better way to solve this problem, it would be much appreciated. Thanks, Tyler Prete
on 2007-01-20 21:06
on 2007-01-21 05:03
I'm not entirely sure, but i think @object.content.name only trows an error if @object.content is nil AND you're in development mode (whiny nils is enabled). Not sure though.
on 2007-01-21 10:49
On 1/20/07, Tyler Prete <email@example.com> wrote: > class Company > alias :company_name :name > end class Company alias_attribute :company_name, :name end -- Chris Wanstrath http://errtheblog.com
on 2007-01-21 15:46
Chris, Thanks! Much much better. I had the feeling that there had to be a better way, and there it is. --Tyler P.S. I really like your blog. Lots of good information on there.