Rails calling User record from Friends model

2019-06-10 07:09发布

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_ids (which is the same as @user) rather than friend_ids.

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...

1条回答
何必那么认真
2楼-- · 2019-06-10 07:23

I think your relations are built a bit wrong. Try something like this:

class User < ActiveRecord::Base
  has_many :friends
  has_many :friendships
  has_many :friends, :through => :friendships

class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => 'User'
  # This class has :user_id and :friend_id

Then everything will be simpler. Every user will have an array of friends that will be just users.

User.first.friends

Will return an array of Users that this User friends.

Hope this helps.

查看更多
登录 后发表回答