将Rails 2.2.2升级到2.3.5后,未定义的方法'total_entries'

时间:2010-05-17 15:16:45

标签: ruby-on-rails will-paginate squirrel-sql

我正在将Rails应用程序从2.2.2升级到2.3.5。唯一剩下的错误是当我调用total_entries来创建jqgrid时。

错误:

NoMethodError (undefined method `total_entries' for #<Array:0xbbe9ab0>)

代码段:

@route = Route.find(
  :all,
  :conditions => "id in (#{params[:id]})"
) {
  if params[:page].present? then
    paginate :page => params[:page], :per_page => params[:rows]
    order_by "#{params[:sidx]} #{params[:sord]}"
  end
}

respond_to do |format|
  format.html # show.html.erb
  format.xml  { render :xml => @route }
  format.json  { render :json => @route }
  format.jgrid {
    render :json => @route.to_jqgrid_json(
      [
        :id, :name
      ],
      params[:page],
      params[:rows],
      @route.total_entries
    )
  }
end

有什么想法吗?谢谢!

修改

我能够通过删除find之后使用的块来使其工作。我还必须移动squirrel插件使用的order_by,因为我正在获取一个未定义的方法调用。

我不喜欢这样的事实,即由于必须在多个位置使用conditions,因此这比前一代码更少。有没有更好的方法来使用Rails 2.3.5,will_paginate和squirrel?

  if params[:page].present? then
    @route = Route.paginate :conditions => "id in (#{params[:id]})", :page => params[:page], :per_page => params[:rows], :order => "`#{params[:sidx]}` #{params[:sord]}"
  else
    @route = Route.find(:all, :conditions => "id in (#{params[:id]})")
  end

编辑2

此错误的另一种可能性可能是我使用Ruby 1.8.7和Rails 2.2.2,现在使用Ruby 1.9.1和Rails 2.3.5。 1.8.7和1.9.1之间是否有任何重大变化会阻止ActiveRecord找不到后阻塞?

1 个答案:

答案 0 :(得分:1)

在Rails 2.3.5中,find(:all,...)调用将返回一个数组,并且通常这些调用没有任何与之关联的自定义方法,就像使用范围一样。将块传递给查找调用也有点不规则,可能是问题的一部分。

您可以通过创建找到所需内容的范围来解决此问题:

class Route < ActiveRecord::Base
  named_scope :with_ids, lambda { |*ids| {
    :conditions => { :id => ids.flatten }
  }}
end

然后你可以改用范围:

@routes = Route.with_ids(params[:id])