Ruby on rails 如何为合适的用户设置业力

Ruby on rails 如何为合适的用户设置业力,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在尝试向我的应用程序添加一个用户业力功能,我几乎完成了,只是业力被授予了另一个用户 注意,我喜欢的系统是从零开始的,不起作用 我想要的是: 当一个用户对一本书进行投票时,我想要一个+1业力奖励给该用户 图书用户 如果一个用户的书被否决的次数多于被否决的次数,我希望这样 用户有负面的业力 我得到的是: 当一本书被升级时,升级该书的用户将获得+1 因果报应,而不是书本用户 当业力为0的用户的书籍被否决时,业力将增加1,而不是减少 类AddKarmaToUsers

我正在尝试向我的应用程序添加一个用户业力功能,我几乎完成了,只是业力被授予了另一个用户

注意,我喜欢的系统是从零开始的,不起作用

我想要的是:

  • 当一个用户对一本书进行投票时,我想要一个+1业力奖励给该用户 图书用户
  • 如果一个用户的书被否决的次数多于被否决的次数,我希望这样 用户有负面的业力
  • 我得到的是:

  • 当一本书被升级时,升级该书的用户将获得+1 因果报应,而不是书本用户
  • 当业力为0的用户的书籍被否决时,业力将增加1,而不是减少

    类AddKarmaToUsers
  • 我的代码:

    投票.rb

    class Vote < ApplicationRecord
      belongs_to :user
      belongs_to :book
    
      validates_uniqueness_of :user_id, scope: :book_id
    
      after_create :increment_vote, :add_karma
      after_destroy :decrement_vote, :remove_karma
    
      private
    
      def increment_vote
        field = self.upvote ? :upvotes : :downvotes
        Book.find(self.book_id).increment(field).save
      end
    
      def decrement_vote
        field = self.upvote ? :upvotes : :downvotes
        Book.find(self.book_id).decrement(field).save
      end
    
      def add_karma
        user = User.find(self.user_id)
        user.increment(:karma, 1).save
      end
    
      def remove_karma
        user = User.find(self.user_id)
        user.decrement(:karma, 1).save
      end
    end
    
    class投票
    投票控制器.rb

    class VotesController < ApplicationController
        def create
            book_id = params[:book_id]
    
            vote = Vote.new
            vote.book_id = params[:book_id]
            vote.upvote = params[:upvote]
            vote.user_id = current_user.id
    
            #check if vote by this user exists
            existing_vote = Vote.where(user_id: current_user.id, book_id: book_id)
            @new_vote = existing_vote.size < 1
    
            respond_to do |format|
                format.js {
                    if existing_vote.size > 0
                        #destroy existing vote
                        existing_vote.first.destroy
                    else
                        #save new vote
                        if vote.save
                            @success = true
                        else
                            @success = false
                        end
    
                        # @total_upvotes = @book.upvotes
                        # @total_downvotes = @book.downvotes
                    end
                    @book = Book.find(book_id)
                    @is_upvote = params[:upvote]
    
                    render "votes/create"
                }
            end
        end
    
        private
    
        def vote_params
            params.require(:vote).permit(:upvote, :book_id)
        end
    end
    
    class VotesController0
    #破坏现有投票权
    现有的
    其他的
    #保存新选票
    如果投票,请保存
    @成功=正确
    其他的
    @成功=错误
    终止
    #@total_upvoces=@book.upvoces
    #@total_downvows=@book.downvows
    终止
    @book=book.find(book\u id)
    @is_upvote=params[:upvote]
    呈现“投票/创建”
    }
    终止
    终止
    私有的
    def vote_params
    参数require(:vote).permit(:upvote,:book_id)
    终止
    终止
    
    首先,当使用活动记录关系时,您不需要调用
    模型。在类中找到
    ,只需使用其名称调用关系:

    def增量表决
    字段=self.upvote?:赞成票:反对票
    book.increment(字段).save
    终止
    加上因果报应
    user.increment(:karma,1)。保存
    终止
    
    add_karma
    remove_karma
    中,您引用的是投票所属的用户,而不是书籍所有者。为了实现你的目标,你还应该增加和减少书主人的业力:

    def添加业力
    user.increment(:karma,1)。保存
    book.user.increment(:karma,self.upvote?1:-1)。保存
    终止
    解除因果报应
    user.increment(:karma,1)。保存
    书。使用者。减量(:业力,1)。保存
    终止
    
    您可以重写控制器以简化代码:

    class VotesController
    啊,谢谢,我能够将业力分配给book.user,但如果向下投票数大于向上投票数,用户仍然不会得到负面业力。相反,会分配积极的业力。例如,我数据库中的一个用户没有记录任何向上投票,而业力仍然为零(0),如果另一个用户对拥有零业力记录的用户进行向下投票,业力变为1,而不是-1。但是当减少现有的积极业力时,它可以正常工作。@TolaseAdegbite你的activerecord有回调功能吗?确保这些回调函数不返回负数或false,尤其是-1。我记得在生产代码中有一个奇怪的bug,每当在回调中执行一个返回负数的函数时,它都会被回滚,就好像永远不会发生一样all@TolaseAdegbite请参阅答案中更新的
    add_karma
    方法。