在 rails 中从 will_paginate 切换到 pagy gem 时,方法 "where" 不起作用

method "where" does not work when switched from will_paginate to pagy gem in rails

我在控制器中的 will_paginate 代码:

@posts = Post.paginate(page: params[:page], per_page: 100).order('created_at DESC')

我替换它的页面代码:

@pagy, @posts = pagy_countless(Post.order('created_at DESC'), items:5, link_extra: 'class="" style="color:#222222; margin:3px;"')

我认为问题所在:

<% @posts.where(user_id: current_user.friends).each do |post| %>

错误信息:

undefined method `where' for #<Array:0x00007f94329d1f70>
Did you mean?  when

我做错了什么?之前的 will_paginate 实现在显示用户朋友的所有帖子方面起作用。我不知道切换到 pagy 后发生了什么变化。

更新:

所以目前,我通过将 "where..." 逻辑移至控制器解决了这个问题。所以:

@pagy, @posts = pagy_countless(Post.where(user_id: current_user.friends).order('created_at DESC'), items:5, link_extra: 'class="" style="color:#222222; margin:3px;"')

现在一切如常。但我仍然对为什么我必须这样做感到困惑。

注意 pagy_countless returns 项目数组,而不是 ActiveRecord 集合。这就是为什么你不能在 @posts(比如 where)上使用 ActiveRecord 方法的原因。

按照我的 link 来查看使用 to_a 将集合转换为数组,然后将其作为 pagy_countless 的第二个参数返回:https://github.com/ddnexus/pagy/blob/bd88866ad6001ae1ef6ce63080d36ecff7bc5603/lib/pagy/extras/countless.rb#L29

两条评论:
1. 在对集合调用 pagy_countless 之前必须使用 ActiveRecord 过滤器(例如:where 子句)
2.如果需要在分页后过滤记录(大多数情况下没有意义),必须使用Array方法,如rejectselect如下@posts.select { |record| record.user.in?(current_user.friends) }