ruby-on-rails - 使用acts_as_votable 的缓存计数

标签 ruby-on-rails caching activerecord

我有一个观点正在遍历一系列帖子,并且正在统计每个帖子的投票数。我知道如何进行预先加载以及如何使用缓存计数器。但是我不知道如何使用acts_as_votable 附带的缓存计数器(或者我做错了什么。)

看法:

        <span class="votes">
        <% if current_user.voted_for? link %>
            <%= link_to like_link_path(link), class: "likes active", id: "link-#{link.id}", remote: true, method: :put do %>
            <i class="fa fa-heart"></i> <%= link.cached_votes_total.to_s %>
            <% end %>
        <% else %>
            <%= link_to like_link_path(link), class: "likes", id: "link-#{link.id}", remote: true, method: :put do %>
            <i class="fa fa-heart-o"></i> <%= link.cached_votes_total.to_s %>
            <% end %>
        <% end %>
        </span>

终端:
Link Load (0.4ms)  SELECT  "links".* FROM "links"  ORDER BY "links"."score" DESC LIMIT 10 OFFSET 0
User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" IN (1)
User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
(0.2ms)  SELECT COUNT(*) FROM "votes" WHERE "votes"."voter_id" = $1 AND "votes"."voter_type" = $2 AND "votes"."votable_id" = $3 AND "votes"."votable_type" = $4 AND "votes"."vote_scope" IS NULL  [["voter_id", 1], ["voter_type", "User"], ["votable_id", 1], ["votable_type", "Link"]]
(0.2ms)  SELECT COUNT(*) FROM "votes" WHERE "votes"."voter_id" = $1 AND "votes"."voter_type" = $2 AND "votes"."votable_id" = $3 AND "votes"."votable_type" = $4 AND "votes"."vote_scope" IS NULL  [["voter_id", 1], ["voter_type", "User"], ["votable_id", 2], ["votable_type", "Link"]]
Rendered home/index.html.erb within layouts/application (24.6ms)
Completed 200 OK in 60ms (Views: 56.9ms | ActiveRecord: 1.6ms)

谢谢!

最佳答案

对我来说,这看起来没什么异常。 voted_for?方法是 voted_on? 的别名.继续阅读代码你会发现这个方法调用了一个 votes.size > 0 ,这将触发对数据库的以下查询。 (我猜你的页面上有 2 个链接,对吧?)所以它与缓存的计数字段无关。

(0.2ms)  SELECT COUNT(*) FROM "votes" WHERE "votes"."voter_id" = $1 AND "votes"."voter_type" = $2 AND "votes"."votable_id" = $3 AND "votes"."votable_type" = $4 AND "votes"."vote_scope" IS NULL  [["voter_id", 1], ["voter_type", "User"], ["votable_id", 1], ["votable_type", "Link"]]
(0.2ms)  SELECT COUNT(*) FROM "votes" WHERE "votes"."voter_id" = $1 AND "votes"."voter_type" = $2 AND "votes"."votable_id" = $3 AND "votes"."votable_type" = $4 AND "votes"."vote_scope" IS NULL  [["voter_id", 1], ["voter_type", "User"], ["votable_id", 2], ["votable_type", "Link"]]

附言代码在这里:github: voter.rb .

关于ruby-on-rails - 使用acts_as_votable 的缓存计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31463769/

相关文章:

ruby-on-rails - Rails 5 - 多个外键属于同一个表

ruby-on-rails - 如何使用 mocha stub send_file

ruby-on-rails - Rails 5.0.0.1 namspaced Controller 和渲染部分。漏洞?

ruby-on-rails - Capistrano 部署失败 - 远程主机关闭连接 - 任务 : TOP => rbenv:validate

caching - openrasta 中的服务器端缓存

python django 从命令加载缓存 TfidfVectorizer 并在 View 中使用

javascript - ServiceWorker/Cache API 中的通配符

ruby - 导轨 4 : Append to a "has_many" relation without saving to DB

mysql - 获取平均值时在 Ruby + Rails 中执行子查询的最佳方法?

ruby-on-rails - 如何在 Rails 中编写 channel.html 文件(针对 Facebook)