【问题标题】:How to set karma to appropriate user如何将业力设置给适当的用户
【发布时间】:2020-04-12 19:19:47
【问题描述】:

我正在尝试将用户业力功能添加到我的应用程序中,我几乎完成了,只是业力被授予不同的用户。

注意,我喜欢的系统是从头开始的,而不是acts_as_votable。

我想要什么:

  1. 当用户为一本书点赞时,我希望将 +1 业力奖励给 book.user
  2. 如果用户的书籍被否决的次数多于他们的投赞成票数,我想要这样 用户有负面业力。

我得到了什么:

  1. 当一本书被点赞时,点赞该书的用户将获得 +1 业力而不是 book.user。
  2. 当业力为 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

votes_controller.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

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    首先,当使用活动记录关系时,您不需要在类中调用Model.find,只需使用它的名称调用关系即可:

      def increment_vote
        field = self.upvote ? :upvotes : :downvotes
        book.increment(field).save
      end
    
      def add_karma
        user.increment(:karma, 1).save
      end
    

    add_karmaremove_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
    

    【讨论】:

    • 啊,谢谢,我能够将业力分配给 book.user,但如果反对的次数多于赞成的人数,用户仍然不会得到负面的业力。而是分配积极的业力。
    • 例如,我的数据库中的用户没有记录赞成票并且业力仍然为零(0),如果另一个用户应该反对零业力的用户的书,业力变为1而不是- 1.
    • 但在减少现有的正面业力时效果很好。
    • @TolaseAdegbite 你的activerecord有回调函数吗?确保这些回调中的函数不返回负数或 false,尤其是 -1。我记得在生产代码中有一个奇怪的错误,每当回调中执行的函数返回负数时,它就会被回滚,就好像它根本不会发生一样
    • @TolaseAdegbite 请参阅答案中更新的add_karma 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    相关资源
    最近更新 更多