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

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