.count方法不适用于Heroku应用程序

时间:2015-11-15 03:47:11

标签: ruby-on-rails heroku

我正在尝试在我的应用的索引视图中显示数组项的计数。

在控制器中,我在控制器更新方法中有以下代码:

def update
params[:course][:member_ids] ||= []
params[:teacher_name]
params[:attendees]


@course=Course.find(params[:id])
@count_attendance=@course.attendees.count


@course.update_attribute(:attendance, @count_attendance)

在视图中,我使用以下内容显示数组元素的数量

<td><%= course.attendance %></td>

计数显示在localhost上但是当部署到heroku时,我收到以下错误:

  

NoMethodError(未定义的方法`count&#39; for nil:NilClass):

我错过了什么?

2 个答案:

答案 0 :(得分:2)

undefined method `count' for nil:NilClass

这意味着,您在count对象上调用nil,这意味着@course.attendees正在您的heroku数据库上返回nil,因此当您致电:{{1它试图调用:@course.attendees.count并得到上述错误。

确保您的heroku数据库中有nil.count的{​​{1}}数据,然后重试。它应该工作!

您可以通过登录heroku rails console attendees来查看heroku数据库中是否有数据,然后抓住@course,例如:heroku run rails console,然后查看是否您拥有heroku数据库中特定coursecourse = Course.find(123)的{​​{1}}数据。

您还可以使用try,这样一来,如果某个attendees对象上的course调用了该应用,那么该应用就不会崩溃:

course.attendees

答案 1 :(得分:1)

正如K M Rakibul Islam所解释的那样,您的问题是您在未定义的变量(.count)上调用@course.attendees

-

修复 - 根据此答案:ActiveRecord: size vs count - 可以使用size代替count

@count_attendance = @course.attendees.size

如果这仍然返回相同的错误,您将要使用一些条件代码,以确保您只在attendees上调用方法(如果存在):

def update
   @course = Course.find params[:id]
   @course.update attendance: @count.attendees.size if @count.attendees.any?
end

counter_cache

很多更好的解决方案是Rails的counter_cache functionality

#app/models/attendee.rb
class Attendee < ActiveRecord::Base
   belongs_to :course, counter_cache: :attendance
end

#app/models/course.rb
class Course < ActiveRecord::Base
   has_many :attendees
end

来自文档:

  

:counter_cache选项可用于更有效地查找归属对象的数量......

     

使用这些声明,要求@customer.orders.size的值需要调用数据库来执行COUNT(*)查询。要避免此调用,您可以向所属模型添加计数器缓存

-

您的功能在开发中运行而非生产的原因是您的开发db可能会attendees填充相关数据。 Heroku使用单独的数据库,这意味着您必须适应任何nil响应。