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

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


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
has_many :votees, :through => :votes_made, :source => :user, :uniq
=> true
has_many :voters, :through => :votes_received, :source
=> :user, :uniq => true

end

On 20 Jul 2008, at 17:41, Sazima wrote:

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.

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.

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…

On Jul 20, 3:42 pm, Frederick C. [email protected]

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

Cheers, Sazima