[: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)
http://blog.inquirylabs.com/