Rails 指南中 Ruby 中文章的未定义方法“comments_count”

undefined method `comments_count' for Article in Ruby on Rails guide

我是 Rails 的新手。跟着Rails5.1.4的Getting Started Guide发了个博客。我的 articles/index.html.erb 模板文件如下所示:

<% @articles.each do |article| %>
    <%= article.comments.count %></td>
<% end %>

一切正常。


但是,在下一指南的 Schema Conventions 部分,我们将介绍一个名为 (table_name)_count 的保留列名称。它说我们可以使用 comments_count 作为文章模型的列名来获取与该文章相关的评论的缓存计数。

所以我重写了我的 articles/index.html.erb 模板,如下所示:

<% @articles.each do |article| %>
    <%= article.comments_count %></td>
<% end %>

但是当我重新加载浏览器时,出现以下错误:

undefined method `comments_count' for #Article:0x007fb51fb001b8. Did you mean? comments

我错过了什么?

问题是当您添加特殊列时,对 comments.size 的调用实际上使用该列而不是对列进行计数。您不必更改代码。

看这里:http://guides.rubyonrails.org/association_basics.html#options-for-belongs-to-counter-cache

rails documentation 在这里说的是,某些 默认行为约定 应用于具有某些 names/patterns 的列(也可以是 altered/removed,如果需要的话)。

例如,created_at 列(如果存在!)将在您创建记录时自动设置.或者,type 列(同样, 如果它存在!)将自动(除非你告诉它不要)被解释为在 Single Table Inheritance 的上下文中使用.

当您生成 rails 模型以创建新的 table (rails generate model person) 时,默认迁移文件包含行 t.timestamps。这是可选的,但它告诉 Rails 包含列:created_atupdated_at 用于您的 table.

但是,comments_count 等其他列将 不会 创建 "by default"(因为为 [=36 设置计数器缓存效率非常低) =]每个协会!)。为了使用此功能,您需要在新的迁移文件中显式创建列。

您可以通过阅读 db/schema.rb (或者直接连接到数据库,当然!)

有关如何实现计数器缓存的详细信息,请参阅 rails documentation