0

我有一个用户发布的应用程序。我有一个过滤器,它将根据通过 params[] 哈希传递的值来排序和检索不同的帖子。我不断收到明显存在的类方法的无方法错误。这是我要运行的查询(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}

任何和所有输入表示赞赏。

4

2 回答 2

2

这是因为您的“where_filter”方法正在将其从活动记录关系对象更改为数组:

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

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

于 2012-09-23T22:18:36.153 回答
0

出于某种原因,当我将查询和排序折叠到一个类方法中时,它起作用了。但是,由于 Kiminari(我用于分页)默认情况下无法对数组进行分页,因此我必须使用该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
于 2012-09-24T00:20:54.260 回答