Как скрыть друзей, которых я уже добавил в друзья? - PullRequest
0 голосов
/ 06 января 2020

У меня есть следующий код. Добавление друга часть работает хорошо. Но потом я все еще вижу кнопку «Добавить друга». Поэтому я добавил <% if ... part, но ошибка @friendship (код контроллера ниже), поэтому я добавил <% @ friendships.each do ... part. Все еще не работает; Многие "Добавить друга" на каждом шоу пользователя. </p>

<% @friendships.each do |friendship|%>
  <% if current_user.id != friendship.user_id and post.book.user_id != friendship.friend_id %>
    <%= link_to "Add Friend", friendships_path(:friend_id => post.book.user_id), :method => :post %>
  <% end %> 
<% end %>

Контроллер:

@friendship = Friendship.where(friend_id: params[:user_id])
@friendships = Friendship.all

Как это исправить? Было бы лучше отменить миграцию и установить гем has_friendship (отменить, потому что и гем, и моя текущая реализация используют модель «дружбы»)?

Модель дружбы:

class Friendship < ApplicationRecord
  belongs_to :user
  belongs_to :friend, :class_name => "User"
  has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
  has_many :inverse_friends, :through => :inverse_friendships, :source => :user
end

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Насколько я понимаю, проблема: «много« Добавить друга »на каждом показе пользователя». Итак, у вас есть пользовательская страница показа, и пусть она будет переменной @user.

<% if !current_user.friendships.where(friend_id: @user.id).exists? %>
  <button>Add Friend</button>
<% end %>

exists? метод более эффективен, чем другие методы. Если вы находитесь на специальной странице пользователя, вам не нужно заводить всех друзей.

Кроме того, просто для ясности

@friendships = Friendship.all

Загрузит всех друзей всех пользователей, а не только для текущего пользователя. .

Кроме того, в этой реализации необходимо убедиться, что добавление друга является симметричным, после добавления таблицы друзей должно быть 2 строки

| user_id | friend_id |
|       1 |.        2 |
|.      2 |.        1 |

В противном случае ваш друг не может знать, что он твой друг. Я предлагаю индексировать оба столбца.

О геме has_friendship: не использовал, но я полагаю, что пользовательский код в такой ситуации будет более гибким и простым в настройке.

0 голосов
/ 07 января 2020

Как написано, похоже, что вы перебираете все дружеские отношения, существующие в вашей базе данных. Вам нужно только l oop через друзей текущего пользователя.

Мало того, что это будет намного меньший список, но каждый член этого списка уже будет другом, и вам не придется спрашивать, должна ли отображаться ссылка «Добавить друга».

Рассмотрим следующее.

Сначала мы переформулируем модели немного по-другому:

class Connection < ApplicationRecord
  belongs_to :user
  belongs_to :friend, class_name: "User"
end

class User < ApplicationRecord
  has_many :connections
  has_many :friends, through: :connections, class_name: "User"
end

Затем мы создадим некоторых пользователей:

Loading development environment (Rails 6.0.2.1)
irb(main):001:0> ['User One', 'User Two', 'User Three' ].each { |u| User.create(name: u) }
...
=> ["User One", "User Two", "User Three"]
irb(main):002:0> users = User.all
...
irb(main):003:0> users.size
...
=> 3
irb(main):004:0>

Затем мы подключаем некоторых пользователей:

irb(main):004:0> Connection.create(user: User.first,  friend: User.second)
irb(main):005:0> Connection.create(user: User.second, friend: User.first)
irb(main):006:0> Connection.create(user: User.second, friend: User.third)
irb(main):007:0> Connection.create(user: User.third,  friend: User.second)

Теперь мы можем отобразить друзей определенного пользователя, например:

<% @user.friends.each do |friend| %>
  <% friend.name %>
  ...
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...