HELP with self-referential join (using another model as join table)

Hi all,

I'm having problems with the following relationship, can anybody help
me out here? I'm using Rails 2.1.

Cheers, Sazima

# Table name: votes

Hi all,

I'm having problems with the following relationship, can anybody help
me out here? I'm using Rails 2.1.

You don't say exactly what problems you're having, so just some quick comments.

Cheers, Sazima

# Table name: votes
#
# Field Type Null Default
# id int(11) No auto_increment
# voter_id int(11) No
# voted_id int(11) No
# type int(11) No 0
# value varchar(255) Yes NULL
# status int(11) Yes 0
# created_at datetime Yes NULL
# updated_at datetime Yes NULL
#

class Vote < ActiveRecord::Base
belongs_to :voter, :class_name => :user, :foreign_key => :voter_id
belongs_to :voted, :class_name => :user, :foreign_key => :voted_id
end

Can't remember off the top of my head whether it really matters but that should have :class_name => 'User'.
You don't need the foreign key option here - the default is assocation name + _id

Your type column will cause problems: rails uses the type column for single table inheritance, as it is you'll probably get some horrendous error whenever you try and load an
instance of Vote.

#
------------------------------------------------------------------------------------------------------------

# Table name: users
#
# id :integer(11) not null, primary key
# login :string(255)
# crypted_password :string(40)
# salt :string(40)
# created_at :datetime
# updated_at :datetime

class User < ActiveRecord::Base

# Votes
has_many :votes_made, :class_name => :vote, :foreign_key
=> :voter_id
has_many :votes_received, :class_name => :vote, :foreign_key
=> :voted_id

That should probably also be :class_name => 'Vote'

has_many :votees, :through => :votes_made, :source => :user, :uniq
=> true
has_many :voters, :through => :votes_received, :source
=> :user, :uniq => true

You're not using the :source option correctly. What you're telling rails is 'so load the votes_made association, then grab the association named x (the default would be votee).
So you source option here should be :voter or :voted

Fred

Hey Fred,

Thanks a lot for the comments. I had already tried 'User' and 'Vote',
as well as commented the "has_many ... through" statements, but didn't
thought of the type conflict. That was it! Thanks!

Cheers, Sazima

P.S.: That would be a nice addition to the migration mechanism: an
alert when a column with such a name is used...

And yeah, you were also right about the :user x ' User' and :source
things...

Cheers, Sazima