计数器缓存定制为零和大数字

时间:2017-04-29 00:37:44

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-5

我还在学习rails,所以你能提供的任何帮助都会非常有帮助。我已经在我的图书应用中为我的喜欢设置了计数。因此,每当用户喜欢一本书时 - 该数字会增加一个,或者如果与之不同则会减少。但是,如果还没有人喜欢一本书 - 会出现0。我希望它是空白的,这样只有当用户喜欢它时才会显示该数字。我在下面列出了所有相关代码。非常感谢你。

Schema.rb

create_table "books", force: :cascade do |t|
  t.string   "title"
  t.integer  "user_id"
  t.integer  "book_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.string   "avatar_file_name"
  t.string   "avatar_content_type"
  t.integer  "avatar_file_size"
  t.datetime "avatar_updated_at"
  t.integer  "likes_count", default: 0, null: false
end

create_table "likes", force: :cascade do |t|
  t.integer  "user_id"
  t.integer  "book_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

Book.rb

class Book < ApplicationRecord
  has_many :likes, :counter_cache => true
  has_many :users, through: :likes
  belongs_to :user
end

Likes.rb

class Like < ApplicationRecord
  belongs_to :book, :counter_cache => true
  belongs_to :user
end

喜欢计数迁移

class AddLikecountsToBook < ActiveRecord::Migration[5.0]
  def change
    add_column :books, :likes_count, :integer, :null => false, :default => 0
  end
end

2 个答案:

答案 0 :(得分:3)

通过rails中的关联,您可以获得几种可用于创建条件表达式的.any?.none?等交互方法。

<% if book.likes.any? %>
  <%= number_to_human(book.likes.size) %>
<% end %>

# or
<%= number_to_human(book.likes.size) unless book.likes.none? %>

这也使用计数器缓存来避免n + 1个查询。

答案 1 :(得分:1)

如果您不希望视图显示0,则可以在视图中添加if语句。

<% if @votes == 0 %>
  be the first to rate this book
<% else %>
  <%= @votes %>
<% end %>

或者将变量从控制器返回到视图

def
  if @votes == 0
    @votes = ''
  end
end