Уничтожение UpVotes на act_as_votable

У меня есть приложение rails, которое работает нормально, используя act_as_votable. Кнопка "Мне нравится" увеличивает количество сообщений, а затем переключается на кнопку "Мне не нравится", и это уменьшает количество сообщений.

Моя проблема в том, что с тех пор, как я начал использовать гем Public Activity, я не могу найти способ удалить лайки из фида. Я использовал следующий цикл в представлении индекса действий:

<% @activities.each do |activity| %>
    <p>
        <% if activity.trackable %>
            <%= link_to activity.owner.name, activity.owner %>
            <%= render_activity activity %>
        <% end %>
    </p>
<% end %>

Когда я удаляю комментарий, вся строка в ленте активности "FOO добавил комментарий к BAR" исчезает. Тем не менее, так как действия в качестве избирательного драгоценного камня на самом деле создают отрицательное голосование, а не разрушают его, строка "FOO like BAR" все еще появляется, и за ней последует "FOO unliked BAR".

Кто-нибудь знает, как я могу найти upvote с помощью current_user в конкретном сообщении, а затем уничтожить его?

Ниже приведен код моего контроллера для "как" и "в отличие":

def like
  @ink.create_activity :like, owner: current_user
  @ink.upvote_by current_user

  redirect_to :back
end

def unlike
  @ink.downvote_by current_user

  redirect_to :back
end

Спасибо

3 ответа

Решение

Для любого, кто столкнется с этим в будущем, благодаря Element119, я в конечном итоге смог точно определить лайки текущих пользователей по конкретному посту с помощью нескольких переменных и поиска по всему миру. Затем я уничтожил точно определенные лайки.

def like
    @post.create_activity  :like, 
                           owner: current_user,
                           recipient: @post.user
    @post.upvote_by current_user

    redirect_to :back
  end



def unlike
    @post.downvote_by current_user

    @currentUserLikes = PublicActivity::Activity.where(trackable_id: @post.id, owner_id: current_user.id, key: "post.like")
    @currentUserLikes.destroy_all

    redirect_to :back
  end

Я знаю, что на этот вопрос уже дан ответ, но идеальным и самым простым ответом было бы использование официального метода gem, который является unvote_by, он работает как для повышающих, так и понижающих голосов.

Похоже, что вы хотите сделать, это удалить аналогичные уведомления модели, когда она "не понравилась" - это правильно? Все, что вам нужно сделать, это найти соответствующую деятельность и уничтожить ее. Поскольку действия являются моделями, как и любые другие, вы можете сделать это с destroy и / или destroy_all,

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

Вы также можете найти полезным удалить запись по ее trackable_id - например:

@activity = PublicActivity::Activity.find_by(trackable_id: (params[:id]), trackable_type: controller_path.classify)
@activity.destroy

Там больше информации о том, как это работает в этом ответе.

Другие вопросы по тегам