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_at
和 updated_at
用于您的 table.
但是,comments_count
等其他列将 不会 创建 "by default"(因为为 [=36 设置计数器缓存效率非常低) =]每个协会!)。为了使用此功能,您需要在新的迁移文件中显式创建列。
您可以通过阅读 db/schema.rb
(或者直接连接到数据库,当然!)
有关如何实现计数器缓存的详细信息,请参阅 rails documentation。
我是 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_at
和 updated_at
用于您的 table.
但是,comments_count
等其他列将 不会 创建 "by default"(因为为 [=36 设置计数器缓存效率非常低) =]每个协会!)。为了使用此功能,您需要在新的迁移文件中显式创建列。
您可以通过阅读 db/schema.rb
(或者直接连接到数据库,当然!)
有关如何实现计数器缓存的详细信息,请参阅 rails documentation。