A model should only talk to its immediate association. According to the 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 accomplish 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 %>
Originally published at Kolosek blog.
Top comments (0)