Class that belongs_to another Class twice?

I have Class Referral which takes both a giver and receiver as a Person.
As is, @person.referrals returns all referrals as appropriate. Using
built in AR methods, @referral.person returns the receiver of the
referral. To find out who issued the referral, I have created an
instance method "giver" so that @referral.giver returns the Person who
gave it. I looked at Chad Fowler's "Self-Referential MtM Models" but
I'm not sure my situation is the same. The current setup I have works,
but I'm not sure if there is a better Rails way to do this.

>MIGRATIONclass CreateReferrals < ActiveRecord::Migration
  def self.up
    create_table :referrals do |t|
      t.column :giver_id, :integer, :null => false
      t.column :receiver_id, :integer, :null => false
      t.column :body, :text, :null => false
      t.column :created_at, :datetime
    end

>REFERRAL MODELclass Referral < ActiveRecord::Base
  belongs_to :person

     has_one :giver, :class_name => "Person"

  validates_uniqueness_of :giver_id, :scope => :receiver_id

  def giver
    Person.find(self.giver_id)
  end

>PERSON MODELclass Person < ActiveRecord::Base

  has_many :referrals, :foreign_key => "receiver_id"

--
Posted viahttp://www.ruby-forum.com/.

I think you should be able to just add the has_one association to the
referral model and get your attribute accessor for free...

Best,

-r

Ok. Here's what I've got...

## Migrations

    create_table "people" do |t|
      t.column "name", :string
    end
    create_table "referrals" do |t|
      t.column "giver_id", :integer
      t.column "receiver_id", :integer
    end

## Models

class Person < ActiveRecord::Base
  has_many :referrals, :foreign_key => "receiver_id"
end

class Referral < ActiveRecord::Base
  belongs_to :receiver, :class_name => "Person", :foreign_key =>
"receiver_id"
  belongs_to :giver, :class_name => "Person", :foreign_key =>
"giver_id"
end

## Console

r = Person.create
g = Person.create
ref = Referral.create(:giver => g, :receiver => r)

r.reload
g.reload

r.referrals #=> [ ref ]
g.referrals #=> []
ref.giver #=> g
ref.receiver #=> r

Best,

r