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

1 view
Skip to first unread message

Neeraj Kumar

unread,
Jan 1, 2007, 1:37:25 AM1/1/07
to rubyonra...@googlegroups.com
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

Tom Fakes

unread,
Jan 1, 2007, 2:52:11 AM1/1/07
to Ruby on Rails: Talk
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'

Duane Johnson

unread,
Jan 1, 2007, 11:43:04 AM1/1/07
to rubyonra...@googlegroups.com
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 :)

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

Duane Johnson
(canadaduane)
http://blog.inquirylabs.com/

Reply all
Reply to author
Forward
0 new messages