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 }

これが発生すると、他のクエリ メソッドを連鎖させることはできなくなります。whereクエリの「i.net_reputation <= 0」部分を作成しないのはなぜですか?

于 2012-09-23T22:18:36.153 に答える
0

何らかの理由で、クエリと並べ替えを 1 つの Class メソッドに折りたたむと、機能しました。ただし、キミナリ (ページネーションに使用しています) はデフォルトでは配列をページネーションできないため、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

私のpost.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 に答える