追随者在Rails中建模

时间:2016-12-29 11:44:22

标签: ruby-on-rails

在我的应用中,用户可以互相关注。我有两个表:usersfollowers

users

id
name

followers

id
user_id
follower_id

两种模式:

class User < ActiveRecord::Base

  has_many :followers
  belongs_to :follower

end

class Follower < ActiveRecord::Base

  belongs_to :user

end

我想要做的是为用户列出关注者。 e.g。

<ul>
  <% @users.each do |user| %>
      <li><%= user.name %></li>
      <ul>
        <% user.followers.each do |follower| %>
            <li><%= follower.name %></li>
        <% end %>
      </ul>
  <% end %>
</ul>

然而,它看起来并没有看到这种关联...

根据Deep的建议更新我的模型后,我开始工作......但是我无法查询关注者和关注用户。

e.g。

我的UsersController中有两个方法:

def user_followers
  @user = User.where(id: params[:id]).first
  @followers = @user.get_followers
end

def user_following
  @user = User.where(id: params[:id]).first
  @following = @user.get_following
end

然后在我的用户模型中我有:

def get_followers
  Follower.where(follower_id: self.id)
end

def get_following
  Follower.where(user_id: self.id)
end

应该为用户或用户关注的用户返回关注者。观点如下:

<% @followers.each do |follower| %>
    <%= follower.user.name %>
<% end %>

<% @following.each do |following| %>
    <%= following.user.name %>
<% end %>

但是它只返回我应该查看的用户的名字。

追随者模型现在看起来像:

class Follower < ActiveRecord::Base

  belongs_to :user, foreign_key: 'follower_id', class_name: 'User'

end

1 个答案:

答案 0 :(得分:1)

follower.name无效,因为您的follower模型没有名为name的属性。您提供的关联belongs_to :user也会获取已被关注的user。您需要Follower模型中的另一个关联,如:

belongs_to :following_user, foreign_key: 'follower_id', class_name: 'User'

然后在您看来,您可以做的是:

<%= follower.following_user.name %>

这将获取跟随该对象的用户并将从该对象获取name属性。

<强>更新

请勿删除您拥有的现有关联。意味着你的模型应该是这样的:

belongs_to :user    
belongs_to :following_user, foreign_key: 'follower_id', class_name: 'User'

现在正如评论user_id中所讨论的那样,user将被关注,follower_id将由正在关注的user组成。

要获取用户的followers,您将获得将找到followers的关联。就像user.followers一样。并获取名称:

<% user.followers.each do |follower| %>
   <li><%= follower.following_user.name %></li>
<% end %>

要查找关注的用户:

def followed_users
  Follower.where(follower_id: id)
end

并获取名称:

<% user.followed_users.each do |follower| %>
   <li><%= follower.user.name %></li>
<% end %>