Rails:如何自增counter_cache?

Rails: How to increment counter_cache?

:::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

::: 已解决:::

能够在投票模型上找出 counter_cache 并将其用于主题。更新了下面的问题。一旦主题模型有一个 votes_count,我所要做的就是将它放在视图中并在控制器中更新我的计数。结果很简单。然而,查找信息并非如此,所以这应该能帮助其他人摆脱困境,尽管这一切都是令人困惑的。深入了解答案。

干杯

:::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::

:::编辑:::

:::见下文了解历史:::

这是对原始 post 的编辑。在我尝试 gem 解决方案之前,我非常了解我所拥有的。我在投票模型上使用了comment_cache,但现在我不知道如何增加缓存。

class Vote < ActiveRecord::Base
    belongs_to :topic, :counter_cache => true
end

并在视图中调用了 topic.votes.size,它现在显示没有 Active Record 可枚举的计数。

<td><%= pluralize(topic.votes.size, "vote") %></td>
        <td><%= button_to '+1', upvote_topic_path(topic), method: :post %></td>
        <td><%= button_to '-1', downvote_topic_path(topic), method: :post %></td>

index.html.erb

Listing Topics

Title   
test    1 vote  [+1] [-1]   Delete

New Topic

但是comment_cache不允许负数。我仍然在记录上使用 create/destroy,而不是在计数中添加和减去一个数字。如何递增和递减?这些方法说我缺少值。目前 @topic.votes.last.destroy 失败是有道理的,因为没有更多的选票可以销毁,因此计数不能小于零。

如何设置使 incrementing/decrementing 的 comment_cache 值可以为负数?我试过 @topic.votes.increment 和 @topic.votes.increment_counter 但他们要求 2 个参数,我不确定要使用什么。尝试过

@topic.increment_counter(:votes_count, params[:id])

但运气不好。

NoMethodError in TopicsController#upvote
undefined method `increment_counter' for #<Topic:0x007f87d974a4b0>

Extracted source (around line #433):
431
432
433
434
435
436

      else
        match = match_attribute_method?(method.to_s)
        match ? attribute_missing(match, *args, &block) : super
      end
    end

:::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::

:::这条线以下的历史记录:::

:::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::

再次访问 Rails,我正在尝试对主题进行简单的计票。我想做的是 increment/decrement 投票记录中的计数(整数)列。

主题 has_may :votes, and Vote belongs_to :topic

topics_controller.rb我用过

def upvote
    @topic = Topic.find(params[:id])
    @topic.votes.increment_counter(:tally, params[:id])
    redirect_to(topics_path)
  end

  def downvote
    @topic = Topic.find(params[:id])
    @topic.votes.decrement_counter(:tally, params[:id])
    redirect_to(topics_path)
  end

但是我得到了一个有趣的 ActiveRecord 键,而不是视图中的值而不是投票计数。

index.html.erb:

from the view
<td><%= pluralize(topic.votes(:tally), "vote") %></td>
<td><%= button_to '+1', upvote_topic_path(topic), method: :post %></td>
<td><%= button_to '-1', downvote_topic_path(topic), method: :post %></td>

result of view
    test    #<Vote::ActiveRecord_Associations_CollectionProxy:0x007fbb16451f68> votes   

        Delete

来自 Rails 控制台 虽然没有显示增量:

  2.1.5 :022 > Vote.first
  Vote Load (0.5ms)  SELECT  "votes".* FROM "votes"  ORDER BY "votes"."id" ASC LIMIT 1
 => nil 

2.1.5 :023 > Vote
 => Vote(id: integer, topic_id: integer, created_at: datetime, updated_at: datetime, tally: integer) 

我想我已经设置了 routes.rb 可以,但是我不确定是否要加倍

Rails.application.routes.draw do
  resources :topics do
    member do
      post 'upvote'
      post 'downvote'
    end
  end

  root 'topics#index'  
end

无论如何,我认为这要么是错误的递增方法,要么是我遗漏了什么。任何帮助表示赞赏。干杯

你有投票的用户模型吗?如果是这样,有一个非常棒的 gem 可以处理这个叫做 acts_as_votable - https://github.com/ryanto/acts_as_votable

您只需捆绑 gem、运行 迁移,然后将 acts_as_votable 添加到您的主题模型,并将 acts_as_voter 添加到您的用户模型,然后您可以使用大量辅助方法。

TopicsController.rb

    def upvote
        @topic.upvote_by current_user
        redirect_to :back
    end

    def downvote
        @topic.downvote_by current_user
        redirect_to :back
    end

Routes.rb

    resources :topics do
      member do
        get "upvote", to: "topics#upvote"
        get "downvote", to: "topics#downvote"
      end
    end

/topics/show.html.erb

    <%= link_to upvote_topic_path(@topic), method: :get  do %>
    <%= link_to downvote_topic_path(@topic), method: :get  do %>

    <%= pluralize(@topic.get_upvotes.size, 'Vote') %>

::已解决::

我能够在投票模型中使用 counter_cache 解决问题。现在可以对正值和负值进行投票。万岁!

在主题中添加了一个新列。

class AddVotesCount < ActiveRecord::Migration
  def change
    add_column :topics, :votes_count, :integer, :default => 0

  end
end

更新投票模型

class Vote < ActiveRecord::Base
        belongs_to :topic, :counter_cache :true
end

现在在主题控制器中,我可以使用

增加 up/down 方法
@topic.votes_count += 1
.
.
.
@topic.votes_count -= 1

我可以使用@topic.update_attributes,但由于某些原因我发现它不可靠,所以我在每种方法中都选择了@topic.save。

该视图现在仅使用 topics.votes_count,效果很好。

<td><%= pluralize(topic.votes_count, "vote") %></td>
        <td><%= button_to '+1', upvote_topic_path(topic), method: :post %></td>
        <td><%= button_to '-1', downvote_topic_path(topic), method: :post %></td>

这不需要用户模型 and/or acts_as_votable gem。虽然我将来可能会使用 gem,但很高兴弄清楚如何在没有它的情况下完成这项工作。

干杯