[:year, :month, :day].each { |m| delegate m, :to => :published_at }

Given below is a model from mephisto blogging tool.

class Content < ActiveRecord::Base filtered_column :body, :excerpt belongs_to :user, :with_deleted => true belongs_to :site [:year, :month, :day].each { |m| delegate m, :to => :published_at }

end

I couldn’t understand the last line.

Anyone care to explain what’s happening in the last line.

Thanks.

  • Neeraj

This is the quick way of writing the following:

  def year     published_at.year   end

  def year=(y)     published_at.year = y   end

  # Same for month and day

The 'delegate' method allows you to delegate a member access to a member with the same name on a different member object, so you can avoid writing 'content.published_at.year'

Thanks, Tom, that's really handy.

I was wondering where this 'delegate' method is defined, so I looked it up and found it in ActiveSupport--it's a method defined in the Module class. Pretty tricky :slight_smile:

Available here, if anyone else is interested:    activesupport/lib/active_support/core_ext/module/delegation.rb

Duane Johnson (canadaduane)