Composing Data from THREE models with Aggregation

Hello! I'm looking for assistance EXTENDING an example from the Agile
Web Development With Rails book: Composing Data with Aggregation (page
324).

I'm trying to map three columns to a single Ruby object. However,
unlike the example in the Agile Web Development book, the three
columns I want to map into one object come from THREE DIFFERENT
models.

I want to map the following three columns into one object:
grade.grade_abbr, strand.strand_abbr, standard.number (ex. 5 NS 2.3).
Also, I only need to read the new object--not edit the original
columns.

Here are the models and their relationships:

class Standard
  belongs_to :strand
  belongs_to :grade

class Strand
  has_many :standards

class Grade
  has_many :standards

When I originally setup my Standard table with grade_abbr and
strand_abbr, it easy to follow the example in the Agile Web
Development because each column was contained within the Standard
model. However, I had to move Grade and Strand into their own tables,
so the Standard table contains grade_id and strand_id--not the actual
objects themselves.

When I played with the example from the Agile Web Development book, I
couldn't get :grade.grade_abbr and strand.strand_abbr to work. The
code below was the best that I could come up with but it shows
grade_id and strand_id. Does anyone have a suggestion for how to make
this work or for a new strategy?

class Standard < ActiveRecord::Base
  composed_of :full_standard,
              :mapping =>
                [
                  %w[grade_id grade_id],
                  %w[strand_id strand_id]
                  %w[number number]
                ]

class FullStandard < ActiveRecord::Base
  attr_reader :grade_id, :strand_id, :number

  def initialize(grade_id, strand, number)
    @grade_id = grade_id
    @strand_id = strand_id
    @number = number
  end

  def to_s
    [ @grade_id, @strand_id, @number ].compact.join(" ")
  end
end

Hello! I'm looking for assistance EXTENDING an example from the Agile
Web Development With Rails book: Composing Data with Aggregation (page
324).

I'm trying to map three columns to a single Ruby object. However,
unlike the example in the Agile Web Development book, the three
columns I want to map into one object come from THREE DIFFERENT
models.

Composed_of is not normally used (or probably designed to be used) in
this way). The basic idea is that you have some raw attributes and you
turn them into a object, for example you might have attributes on your
model called start and finish and use composed_of to create a magic
attribute called Range whose endpoints are those attributes.

If you want your standard object to have the name from the Grade
object, could you just do

def grade_abbr
  grade.grade_abbr
end

(and when you're happy with this, have a look at delegate)

Fred

Thank you so much for your insights! I checked out delegate and that
really helped to simplify things (especially because I have multiple
related classes with the same name attributes).

In the end, what solved my naming problem was using the following:

<%= link_to "#{course.order_taught} #{course.type_name} #
{course.name}", {:action => 'show', :id => course } %>

I had to take some time to go back and review some of the basics of
Ruby, and in the end, the solution was really simple.

Thanks again for your help!!