我如何在rails中使用array.collect进行分页

时间:2012-09-03 09:26:47

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

我有一组用户喜欢的故事,我想对它进行分页。

为此我尝试:(在用户控制器中)

@stories = @user.likes.paginate(page: params[:page]).map { |e| e.story}

但是我收到了一个错误: undefined method 'total_pages' for #<Array:0x007f9548c4cdd8>

on partial:

<%= will_paginate @stories%>

(顺便说一下,它没有分页就可以正常工作) 我在这做错了什么?

更多信息:

模特之间的联系:

用户模型

class User < ActiveRecord::Base
  has_many :stories
  has_many :likes
end

喜欢型号:

class Like < ActiveRecord::Base
  belongs_to :user
  belongs_to :story
end

故事模型:

class Story < ActiveRecord::Base
  has_many :likes , dependent: :destroy
  has_many :users , through: :likes, source: :users
end

4 个答案:

答案 0 :(得分:1)

在调用paginate之前添加以下代码。

require 'will_paginate/array'

答案 1 :(得分:0)

最后一部分.map { |e| e.story}是原因。实际上要使用will_paginate @stories,您需要将@stories作为will paginate对象。但是在这里你只得到一个stories的简单数组,其中total_pages并不是真的未知。

我没有尝试以下但是它会有点像这样

#FOLLOWING LINE MAY NOT WORK DIRECTLY!!
@stories = @user.likes(:include => :story).paginate(page: params[:page]) 

要点@stories应具有paginate函数的输出。然后will_paginate将与列表一起使用。

编辑:这个怎么样。

@stories = (@user.likes.map { |e| e.story}).paginate(page: params[:page]) 

实际上我现在无法测试它,所以只是试图根据我的假设弄清楚它。

答案 2 :(得分:0)

当您致电map { |e| e.story}时,您将丢弃遗嘱分页集合(其中包含您所在的页面,总页数等信息)并将其替换为直接数组。

这样的事情应该有效:

likes = @user.likes.paginate(page: params[:page])
@stories = WillPaginate::Collection.create(likes.current_page, likes.per_page, likes.total_entries) do |pager|
  pager.replace likes.collect {|l| l.story}
end

这将创建一个具有相同元数据但新内容的新意愿分页集合。

答案 3 :(得分:0)

我听说过如何做到这一点

但最好的是添加到用户模型:

class User < ActiveRecord::Base
  has_many :stories
  has_many :likes
  has_many :liked_stories, through: :likes , source: :story
end

在控制器中

@stories = @user.liked_stories.paginate(page: params[:page])