Rails delegate

A model should only talk to it’s immediate association. According to law of demeter, you shouldn’t talk to the association’s property or association’s association.

Here we talk about Rails delegate approach

BAD SMELL

class Profile < ActiveRecord::Base

belongs_to :user

end

<%= @profile.user.address %>
<%= @profile.user.city %>

Rails provides helper method to acomplish delegation, which uses DSL to generate wrapper methods. It can also prevent error call method on nil object if :allow_nil => true is added.

Refactored

class Profile < ActiveRecord::Base
  belongs_to :user
  delegate :address, :city, :to => :user, :prefix => true, :allow_nil => true
end
<%= @profile.user_address %>
<%= @profile.user_city %>