链接.order与.where - 未定义的方法`order&#39; for#<array:0x007f85760dcb10> </array:0x007f85760dcb10>

时间:2014-11-29 21:38:21

标签: ruby-on-rails

所以我想显示所有数据 我要么试试

@movies = Movie.find(:all)
or
@movies = Movie.scope #default call I think?

但是如果有一个参数集

,我也希望能够.order
 @movies = @movies.order(params[:sort_by]) if params[:sort_by]

我收到以下错误

  

的未定义方法`order'

不确定如何解决此问题

编辑:更新 这是代码。如果.where也存在,我似乎无法使.order工作。 (如果我注释掉。然后.order开始工作

  

  def index                                                                                                                                                                                                       
    @all_ratings = Movie.get_ratings                                                                                                                                                                              
    @movies = Movie.all                                                                                                                                                                                           
    sort_column = sort_by_column((params[:sort_by] || session[:sort_by]))                                                                                                                                         
    @movies = @movies.order(sort_column) if !sort_column.nil?                                                                                                                                                     

    ratings = (params[:ratings] || session[:ratings])                                                                                                                                                             
    if params[:commit] == "Refresh"                                                                                                                                                                               
      if !ratings.nil?                                                                                                                                                                                            
        @movies = @movies.where(rating: params[:ratings].keys)                                                                                                                                                    
      else                                                                                                                                                                                                        
        @movies = @movies.where(rating: @all_ratings)                                                                                                                                                             
      end                                                                                                                                                                                                         
      session[:ratings] = params[:ratings]                                                                                                                                                                        
    else                                                                                                                                                                                                          
      is_param_empty = (params[:ratings].nil?) ? true : false                                                                                                                                                     
      @movies = @movies.where(sort_by_ratings(ratings, is_param_empty))                                                                                                                                           
    end                                                                                                                                                                                                           
  end   
  

私人

def sort_by_column(sort_column)                                                                                                                                                                               
  sort_by = Movie.column_names.include?(sort_column) ? sort_column : nil                                                                 

  if !sort_by.nil?                                                                                                                                                                                            
    params[:sort_by] = session[:sort_by] = sort_by                                                                                                                                                            
  end                                                                                                                                                                                                         
  return sort_by                                                                                                                                                                                              
end                                                                                                                                                                                                           

def sort_by_ratings(ratings, is_param_empty)                                                                                                                                                                  
  if is_param_empty == true                                                                                                                                                                                   
    params[:ratings] = session[:ratings]                                                                                                                                                                      
    redirect_to movies_path(:ratings => params[:ratings], :commit => "Refresh",                                                                                                                               
                            :sort_by => params[:sort_by])                                                                                                                                                     
  else                                                                                                                                                                                                        
    session[:ratings] = params[:ratings] = ratings                                                                                                                                                            
    return ratings.keys                                                                                                                                                                                       
  end                                                                                                                                                                                                         
end

为#error

获取未定义的方法`order'

2 个答案:

答案 0 :(得分:2)

在Rails 3上,ActiveRecord的all方法返回一个数组。因此,如果您尝试在Rails 3上执行User.all.order(:first_name),您将获得:NoMethodError: undefined method 'order' for #<Array:0x007fd795de8a90> 在Rails 4上,all方法返回一个可链接的ActiveRecord_Relation。因此,此代码User.all.order(:first_name)将适用于Rails 4。

如果您使用的是Rails 3,则需要Movie.order代替Movie.all.order

答案 1 :(得分:0)

不确定那里发生了什么,但如果您想订购所有电影记录,请尝试以下方式:

@movies = Movie.all
attr = params[:sort_by]
@movies = @movies.order(attr.to_sym => :asc) if attr