1

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

::: 解決済み :::

Vote モデルで counter_cache を見つけ出し、トピックで使用することができました。以下の質問を更新しました。Topic モデルに votes_count が設定されたら、それをビューに入れ、コントローラーでカウントを更新するだけで済みました。かなりシンプルになりました。しかし、情報を見つけることはそうではなかったので、これは他の人を助けるはずです。答えを求めて下に行きます。

乾杯

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

:::編集:::

:::歴史については以下を参照してください:::

これは元の投稿の編集です。gem ソリューションを試す前に、私は自分が持っているものに本当に近づいています。投票モデルでcomment_cacheを使用しましたが、キャッシュをインクリメントする方法がわかりません。

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

ビューで topic.votes.size を呼び出すと、アクティブ レコードの列挙なしでカウントが表示されるようになりました。

<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 Consoleから:

  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で、ユーザー モデルに多くのヘルパー メソッドを使用できます。

トピックスController.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') %>
于 2015-03-28T22:27:47.617 に答える