2016-12-29 4 views
0

В моем приложении пользователи могут следовать друг за другом. У меня есть две таблицы: users и followers.Модель последователей в Rails

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 

То, что я хочу сделать, это список последователей для пользователя. например

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

Однако это не выглядит видеть связь ...


После обновления моей модели в соответствии с предложениями Deep, я получил это работает ... Но я не в состоянии запросить последователей и следующих пользователей.

например.

У меня есть два метода в моем 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

этого звука больше похож на 'has_and_belongs_to_many' отношения. И к вашей проблеме: любое сообщение об ошибке? – Fallenhero

+0

Ошибка в том, что он не может найти 'имя', потому что он не видит' follower' в качестве пользователя ... – Cameron

ответ

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.

Update:

Не удаляйте существующие ассоциации у вас есть. Значит ваша модель должна выглядеть следующим образом:

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 %> 
+0

Дает мне ошибку: 'SQLite3 :: SQLException: нет такого столбца: users.follower_id: SELECT «пользователи». * FROM «пользователи» WHERE «пользователи». «follower_id» =? LIMIT 1' – Cameron

+0

Можете ли вы попробовать включить 'primary_key: 'id'' в ассоциации? – Deep

+0

Дает мне такую ​​же ошибку. – Cameron

Смежные вопросы