【问题标题】:undefined method `comments_count' for Article in Ruby on Rails guideRuby on Rails 指南中文章的未定义方法“comments_count”
【发布时间】:2017-12-10 19:29:18
【问题描述】:

我是 Rails 新手。我跟着 Rails 5.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 作为文章模型上的列名来获取与该文章关联的 cmets 的缓存计数。

所以我像这样重写我的articles/index.html.erb 模板:

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

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

#Article:0x007fb51fb001b8 的未定义方法“cmets_count”。做过 你的意思是?厘米

我错过了什么?

【问题讨论】:

  • comments_count 可能是一个“保留名称”(即具有特殊行为),但您仍然需要将该列添加到您的数据库架构中!!这不是完全魔法。
  • the documentation的第4.1.2.3节。
  • 嗯。但是这个列名列在指南中其他列神奇地可用 - 比如created_atupdated_at等。
  • “神奇地可用”,它们是作为默认迁移的一部分创建的......您编写的每个创建表的数据库迁移都可能包含以下行:t.timestamps。这告诉 rails 创建这些列作为迁移的一部分。如果您没有在迁移文件中写入t.timestamps,那么这些列也将不存在。如果您查看您的db/schema.rb(或者甚至直接连接到数据库!),您会看到这些列存在。
  • 另一方面,&lt;table_name&gt;_count 列不是默认创建的 - 因为为 all 关联生成计数器会非常浪费且效率低下,无处不在。您应该只在需要时(手动)创建它们,以提高性能。

标签: ruby-on-rails ruby activerecord rails-activerecord ruby-on-rails-5.1


【解决方案1】:

rails documentation 在这里所说的是某些默认行为约定应用于具有某些名称/模式的列(如果需要,也可以更改/删除)。

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

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

但是,诸如comments_count 之类的其他列将“默认”创建(因为为每个 关联设置计数器缓存会非常低效!) .要使用此功能,您需要在新的迁移文件中显式创建列。

您可以通过阅读db/schema.rb(当然也可以直接连接到数据库)来查看数据库的结构(包括存在created_at/updated_at 列,但不存在comments_count 列) !)

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 2016-02-17
      相关资源
      最近更新 更多