在我的应用中,用户可以互相关注。我有两个表:users
和followers
。
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
答案 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 %>