I've built a simple Friend
model, which allows Users
to have multiple friends. Here's what that looks like:
class Friend < ActiveRecord::Base
belongs_to :user
class User < ActiveRecord::Base
has_many :friends
Each friend record just has an id
, user_id
and friend_id
. The user_id
is the id of the user it belongs to and the friend_id
is the id of user they are befriending.
Here's my problem
I'm not quite sure how to display a list of a particular user's friends. @user.friends
will give me a list of all the friend records they have, but not the user accounts of those friends.
For instance, I am trying to build a show
page for the friends
controller:
class FriendsController < ApplicationController
def show
@user = current_user
end
SHOW.HTML.ERB
<% if @user.friends.count > 0 %>
<% @user.friends.each do |friend| %>
<div class="entry">
<%= friend.username %>
This does not work because friend
in this case does not have username
. I need to do something like this in my controller:
@friend = User.find_by_id(friend.friend_id)
But I'm not sure how I would call that in my view in the @user.friends loop. Any thoughts appreciated. Let me know if I need to be more clear.
UPDATE
I've updated my User
model like so:
has_many :friends, :include => :user
has_many :friended_users, :through => :friends, :source => :user, :uniq => true
However, when I run @user.friended_users
it's giving me the user_id
s (which is the same as @user) rather than friend_id
s.
How can I tweak that relationship so it's linking to the friend_id
rather than user_id
?
The more I think about it, I think I may not have set up the relationship properly in the first place. Maybe a User
should has_many :users, through => 'friends'
, but that doesn't really make sense...
UPDATE I've updated my models based on @twooface's input:
class User < ActiveRecord::Base
has_many :friendships
has_many :friends, :through => :friendships
class Friendship < ActiveRecord::Base
belongs_to :user
belongs_to :friend, :class_name => 'User'
class Friend < ActiveRecord::Base
has_many :friendships
has_many :users
I'm just not sure what my Friends table should look like. I assume it should have a primary key and a user_id
? If I create a friendship and friend record, I can do friendship.user
and friendship.friend
and get the correct results, but user.friends
gives me an empty hash...
I think your relations are built a bit wrong. Try something like this:
Then everything will be simpler. Every user will have an array of friends that will be just users.
Will return an array of Users that this User friends.
Hope this helps.