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,但很高兴弄清楚如何在没有它的情况下完成这项工作。
干杯
:::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
::: 已解决:::
能够在投票模型上找出 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,但很高兴弄清楚如何在没有它的情况下完成这项工作。
干杯