1

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

::: 解决了 :::

能够找出 Vote 模型上的 counter_cache 并在主题中使用它。更新了下面的问题。一旦 Topic 模型有了 votes_count,我所要做的就是把它放在视图中并在控制器中更新我的计数。结果很简单。但是没有找到信息,所以这应该可以帮助其他人,在所有令人困惑的荣耀中。一路向下寻找答案。

干杯

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

:::编辑:::

:::历史见下文:::

这是对原帖的修改。在我尝试宝石解决方案之前,我真的很接近我所拥有的。我在投票模型上使用了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 不允许负数。我仍在对记录使用创建/销毁,而不是在计数中添加和减去一个数字。如何增加和减少?这些方法说我缺少值。目前,@topic.votes.last.destroy 失败是有道理的,因为没有更多的投票可以销毁,因此总数不能小于零。

如何设置以便我增加/减少 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,我正在尝试对主题进行简单的投票计数器。我想要做的是增加/减少投票记录中的计数(整数)列。

主题 has_may :votes 和 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

无论如何,我认为这要么是错误的增量方法,要么是我缺少的东西。任何帮助表示赞赏。干杯

4

2 回答 2

1

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

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

主题控制器.rb

    def upvote
        @topic.upvote_by current_user
        redirect_to :back
    end

    def downvote
        @topic.downvote_by current_user
        redirect_to :back
    end

路由.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') %>
于 2015-03-28T22:27:47.617 回答
1

::解决了::

我能够在投票模型中使用 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。

该视图现在仅使用 topic.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>

这不需要用户模型和/或acts_as_votable gem。尽管我将来可能会使用 gem,但弄清楚如何在没有它的情况下完成这项工作是件好事。

干杯

于 2015-03-29T15:13:31.340 回答