kaminari和order_by

时间:2012-05-25 15:43:30

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

所以我列出了我网站的所有成员,并按名称对它们进行分组,以便更好地组织列表。因此,在我看来,我的所有成员都按其成员名称的第一个字母分组,如:

B

Bakedfish
Beercan Dan
Bigmike33x 

C

Cynicalassassin
ect..

无论如何,我还想对这个列表进行分页,但是如果我使用了命令,我就不能将Kaminari的分页参数添加到我的控制器中,因为我得到了一个未定义的方法错误。

所以这不起作用:

@members = Member.all.group_by{|u| u.fullname[0].titleize}.page(params[:page]).per(18)

我的观点如下:

<div class="content">
  <%= paginate @members %>
</div>
    <% @members.keys.sort.each do |starting_letter| %>
            <h3>
            <%= link_to starting_letter, {:action => :browse, :controller =>:members, :letter => starting_letter } %>
</h3>
      <ol>
                <% @members[starting_letter].each do |member| %>
                    <li>
                        <% if member.is_artist? %>
                            <%= link_to member.full_name, member_path(member), :class=>"artist" %>
                        <% else %>
                            <%= link_to member.full_name, member_path(member) %>
                        <% end %>
                    </li>
                <% end %>
        </ol>
    <% end %>

这是我的错误消息:

NoMethodError (undefined method `page' for #<Hash:0x007f78d4bf48f8>):
  app/controllers/members_controller.rb:10:in `index'

1 个答案:

答案 0 :(得分:8)

Kaminari将page方法添加到ActiveRecord::Relation,但Member.all.group_by返回哈希值。这就是你得到这个例外的原因。

我建议在分页后进行分组,例如:

@members = Member.order(:full_name).page(params[:page]).per(18).to_a.group_by { |u| u.fullname[0].upcase }

<强>更新

为了使用paginate助手,您可以分配2个变量,例如:

@paginated_members = Member.order(:full_name).page(params[:page]).per(18)
@members = @paginated_members.to_a.group_by { |u| u.fullname[0].upcase }

并将@paginated_members传递给paginate帮助者。