Ruby on Rails指南中的文章的未定义方法`comments_count'

时间:2017-12-10 19:29:19

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

我是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。难道   你的意思是?评论

我缺少什么?

2 个答案:

答案 0 :(得分:4)

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

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

生成rails模型以创建新表(rails generate model person)时,默认迁移文件包含行t.timestamps。这是可选的,但它会告诉Rails为您的表添加列created_atupdated_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