views:

334

answers:

1

Hi,

Is it possible to use delegate in your Active Record model and use conditions like :if on it?

class User < ActiveRecord::Base
  delegate :company, :to => :master, :if => :has_master?

  belongs_to :master, :class_name => "User"

  def has_master?
    master.present?
  end
end

Thnx!

+2  A: 

No, you can't, but you can pass the :allow_nil => true option to return nil if the master is nil.

class User < ActiveRecord::Base
  delegate :company, :to => :master, :allow_nil => true

  # ...
end

user.master = nil
user.company 
# => nil

user.master = <#User ...>
user.company 
# => ...

Otherwise, you need to write your own custom method instead using the delegate macro for more complex options.

class User < ActiveRecord::Base
  # ...

  def company
    master.company if has_master?
  end

end
Simone Carletti
He could use the new try syntax: master.try(:company) which will return nil if master is nil.
Ryan Bigg
try is only available in ruby 1.9
Subba Rao
Try is available in any Ruby implementation via ActiveSupport but it requires ActiveSupport >= 2.3. Also, in this code I didn't see any real advantage of using try() so I went with the classic implementation.
Simone Carletti