【发布时间】: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_at、updated_at等。 -
“神奇地可用”,它们是作为默认迁移的一部分创建的......您编写的每个创建表的数据库迁移都可能包含以下行:
t.timestamps。这告诉 rails 创建这些列作为迁移的一部分。如果您没有在迁移文件中写入t.timestamps,那么这些列也将不存在。如果您查看您的db/schema.rb(或者甚至直接连接到数据库!),您会看到这些列存在。 -
另一方面,
<table_name>_count列不是默认创建的 - 因为为 all 关联生成计数器会非常浪费且效率低下,无处不在。您应该只在需要时(手动)创建它们,以提高性能。
标签: ruby-on-rails ruby activerecord rails-activerecord ruby-on-rails-5.1