ruby 使用组合模型与pagy,得到未定义的方法'偏移'错误

vh0rcniy  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(138)

我用pagy。我将两个模型合并为一个,并在合并后的模型上使用pagy。我收到这个错误:

undefined method `offset' for #<Array:0x00007f886f88b3b0>

下面代码的最后一行被突出显示。
我的代码:

@problems = Problem.me_and_friends(current_user)
@activities = Activity.me_and_friends(current_user)
@combine = (@problems + @activities).sort{|a,b| a.created_at <=> b.created_at }
@pagy, @combined = pagy_countless(@combine, items:100, link_extra: 'class="" style="color:black; margin:3px;"')

单独对@problems使用分页就可以很好地工作。
我很感激任何帮助。

fruv7luv

fruv7luv1#

一旦调用(@problems + @activities),就会将ActiveRecord::Relation转换为array(这也不好,因为要将所有数据库行加载到内存中,排序,然后对它们进行分页)。Pagy期望ActiveRecord::Relation工作,因此出现错误。
您可以考虑多种解决方案,

  • 更改您的UI以在单独的UI中显示问题和活动,然后您可以分别对它们进行分页
  • 更新您的模型,将问题和活动存储在同一个表中(可能只是指向ProblemActivity的引用表)
  • 如果这两种方法都不可行,您可以考虑为分页推出一个自定义解决方案,但这将是棘手的。

更新日期:2021年6月21日
如果你使用的是Rails 6,它引入了Delegated Types的概念,非常适合这个场景。链接中给出的示例提到了跨不同表的分页问题。

6rvt4ljy

6rvt4ljy2#

pagy可以使用数组,请按照以下步骤操作
在# config/initializers/pagy.rb中添加以下行

require "pagy/extras/array"

然后你可以在控制器中这样使用它

@pagy, @combined = pagy_array(@combine, page: some_page_number,  items:
some_number)

相关问题