:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::
::: 解決済み :::
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
とにかく、インクリメントする方法が間違っているか、何かが足りないと思います。どんな助けでも感謝します。乾杯