Прежде всего, при использовании активных отношений записи вам не нужно вызывать Model.find
в классе, просто вызовите отношение с его именем:
def increment_vote
field = self.upvote ? :upvotes : :downvotes
book.increment(field).save
end
def add_karma
user.increment(:karma, 1).save
end
In add_karma
и remove_karma
Вы ссылаетесь на пользователя, которому принадлежит голос, а не на пользователя, которому принадлежит книга. Для достижения вашей цели вы также должны увеличивать и уменьшать карму владельца книги:
def add_karma
user.increment(:karma, 1).save
book.user.increment(:karma, self.upvote ? 1 : -1).save
end
def remove_karma
user.increment(:karma, 1).save
book.user.decrement(:karma, 1).save
end
Вы можете переписать свой контроллер, чтобы упростить код:
class VotesController < ApplicationController
def create
@vote = current_user.votes.find_or_initialize_by vote_params[:book_id]
@vote.assign_attributes vote_params
@success = @vote.save
# instead of @book = @vote.book just use @vote.book in your view
@book = @vote.book
# instead of @is_upvote you can use @vote.upvote in your view
@is_upvote = @vote.upvote
respond_to do |format|
format.js { render 'votes/create'}
end
end
private
def vote_params
params.require(:vote).permit(:upvote, :book_id)
end
end