slindsey3000
slindsey3000

Reputation: 4271

Rails self join with has_many through relationship

Users can follow other Users through FollowingRelationship

I would like to be able to say

User.first.followings and it returns a list of Users

This is not working:

Class User

  has_many :following_relationships
  has_many :followings, through: :following_relationships, foreign_key: :following_id, source: :user

end

Class FollowingRelationship
  attr_accessible :following_id, :follower_id

  belongs_to :followings, class_name: "User"

end

User.first.followings gives this in console:

SELECT "users".* FROM "users" INNER JOIN "following_relationships" ON "users"."id" = "following_relationships"."user_id" WHERE "following_relationships"."user_id" = 1
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: following_relationships.user_id: SELECT "users".* FROM "users" INNER JOIN "following_relationships" ON "users"."id" = "following_relationships"."user_id" WHERE "following_relationships"."user_id" = 1

Anyone see what piece I am missing?

Upvotes: 0

Views: 793

Answers (1)

Aleksey
Aleksey

Reputation: 2309

I think the problem is that FollowingRelationship model doesn't have any relation with User.
It should have belongs_to :user since you specify source: :user, shouldn't it?

I don't quite understand your models and relations between them but belongs_to :followings looks rather strange.
belongs_to uses singular form since it can't belong to more than one object.

UPDATE 1
To be more clear. I think you should have

class FollowingRelationship
  …
  belongs_to :user
  belongs_to :follower
end

That means followings_relationships table should have user_id and follower_id columns.

UPDATE 2
After some conversation we have figured it out. Here is the code you should have

class User < ActiveRecord::Base

  has_many :fade_relationships, foreign_key: :faded_id

  has_many :fadings, through: :fade_relationships, source: :fading

end

class FadeRelationship < ActiveRecord::Base
  attr_accessible :faded_id, :fading_id

  belongs_to :fading, class_name: "User"

end

Upvotes: 2

Related Questions