我是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
作为文章模型的列名来获取与该文章相关的评论的缓存计数。
所以我重新编写我的articles/index.html.erb
模板,如下所示:
<% @articles.each do |article| %>
<%= article.comments_count %></td>
<% end %>
但是当我重新加载浏览器时,我收到以下错误:
#Article的未定义方法`comments_count':0x007fb51fb001b8。难道 你的意思是?评论
我缺少什么?
答案 0 :(得分:4)
rails documentation在这里说的是某些默认行为约定应用于具有特定名称/模式的列(如果需要,也可以更改/删除)。< / p>
例如,created_at
列(如果存在!)将在创建记录时自动设置。或者,type
列(再次,,如果它存在!)将自动(除非您告诉它不要)被解释为在Single Table Inheritance的上下文中使用。
生成rails模型以创建新表(rails generate model person
)时,默认迁移文件包含行t.timestamps
。这是可选的,但它会告诉Rails为您的表添加列created_at
和updated_at
。
但是,comments_count
等其他列将不“默认”创建<(因为为每个关联提供计数器缓存效率非常低) !)。要使用此功能,您需要在新的迁移文件中显式创建列。
您可以通过阅读created_at
(或只是updated_at
来查看数据库的结构(包括comments_count
/ db/schema.rb
列的存在,但缺少peer_list_box.h
列)当然,直接连接到数据库!)
有关如何实施计数器缓存的更多信息,请参阅rails documentation。
答案 1 :(得分:0)
问题是,当您添加特殊列时,对comments.size
的调用实际上使用该列而不是计算列。您无需更改代码。
看看这里:http://guides.rubyonrails.org/association_basics.html#options-for-belongs-to-counter-cache