类方法的未定义方法

时间:2012-09-23 22:14:32

标签: ruby-on-rails ruby-on-rails-3

我有一个用户发布的应用。我有一个过滤器,它将根据通过params []哈希传递的值来排序和检索不同的帖子。我一直在明显存在的类方法上得到no方法错误。这是我试图运行的查询( posts_controller.rb ):

def room
    select_filter = params[:post_filter]
    course_id = params[:id].to_i

    @posts = Post.where_filter(select_filter, course_id).order_filter(select_filter).page(params[:page])    
end 

每当'select_filter'的值为3时,我都会收到此错误:

undefined method `order_filter' for #<Array:0x007fa012d6eef8>

这是我的模型( post.rb ,请记住每当'select_filter'为3时我都会收到错误):

  def self.where_filter(select_filter, course_id_params)
      case select_filter.to_i
      when 1
        where('course_id = ?', course_id_params)
      when 2
        where('course_id = ?', course_id_params)
      when 3
        where('course_id = ? AND created_at > ?', course_id_params.to_i, 48.hours.ago.utc.to_s(:db))
        .reject! {|i| i.net_reputation <= 0 }
      else
        where('course_id = ?', course_id_params)
      end
    end

  def self.order_filter(select_filter)
      case select_filter.to_i
      when 1
        order('created_at DESC')
      when 2
        sort_by {|i| i.net_reputation}
      when 3
        sort_by {|i| i.net_reputation}
      else
        order('created_at DESC')
      end
  end

奇怪的是,如果我在控制台中运行它,一切都很好。像这样:

Post.where('course_id = ? AND created_at > ?', 10, 48.hours.ago.utc.to_s(:db)).reject {|i| i.net_reputation <= 0 }.sort_by {|i| i.net_reputation}

赞赏任何和所有输入。

2 个答案:

答案 0 :(得分:2)

这是因为你的“where_filter”方法在它到达时将它从活动记录关系对象更改为数组:

.reject! {|i| i.net_reputation <= 0 }

一旦发生这种情况,您就无法再将其他查询方法链接到其上。为什么不只是将“i.net_reputation&lt; = 0”作为where查询的一部分?

答案 1 :(得分:0)

出于某种原因,当我崩溃查询&amp;排序成一个类方法,它工作。但是,由于Kiminari(我用于分页)默认情况下无法对数组进行pagniate,所以我必须使用Kaminari.pageinate_array()方法。

我的posts_controller.rb:

def room
    @course = Course.find(params[:id])
    select_filter = params[:post_filter]
    course_id = params[:id].to_i

    query_posts = Post.select_input_filter(select_filter, course_id)
    @posts = Kaminari.paginate_array(query_posts).page(params[:page])
end

我的帖子.rb:

def self.select_input_filter(select_filter, course_id_params)
    case select_filter.to_i
    when 1
      where('course_id = ?', course_id_params)
      .order('created_at DESC')
    when 2
      where('course_id = ?', course_id_params)
      .sort_by {|i| i.net_reputation}
      .reverse
    when 3
      where('course_id = ? AND created_at > ?', course_id_params.to_i, 48.hours.ago.utc.to_s(:db))
      .reject! {|i| i.net_reputation <= 0 }
      .sort_by {|i| i.net_reputation}
      .reverse
    else
      where('course_id = ?', course_id_params)
      .order('created_at DESC')
    end
end