[Rails] 그룹화 시 페이지 스타일

개시하다


기록 목록을 조합해서 표시할 때, 페이지의 단자가 약간 걸려 넘어지기 때문에, 총괄합니다.
페이지에 카미나리를 사용합니다.

일반 페이지 스타일


예를 들어 모든 사용자를 얻은 후, 일람표에 표시된 10개의 페이지 문자는 다음과 같다.
app/controllers/users_controller.rb
def index
  page = params[:page] || 1
  @users = User.all.page(page).per(10)
end
app/views/users/index.html.erb
<table>
  <thead>
    <tr>
      <th>ユーザー情報</th>
    </tr>
  </thead>

  <tbody>
  <% @users.each do |user| %>
    <tr>
      <td>id:<%= user.id %></td>
      <td>name:<%= user.name %></td>
    </tr>
  </tbody>
  <% end %>
</table>
<div class="m_t_30">
  <ul><%= paginate(@users) %></ul>
</div> 
또한 카미나리에서도 페이지 하이픈으로 배열할 수 있다.
app/controllers/users_controller.rb
  def index
    page = params[:page] || 1
    array = []
    users = User.all
    users.each do |user|
      array.push({
        id: user.id,
        name: user.name
      })
    end
    @paginated_array = Kaminari.paginate_array(array).page(params[:page]).per(10)
  end
app/views/users/index.html.erb
<table>
  <thead>
    <tr>
      <th>ユーザー情報</th>
    </tr>
  </thead>

  <tbody>
  <% @paginated_array.each do |item| %>
    <tr>
      <td>id:<%= item[:id] %></td>
      <td>name:<%= item[:name] %></td>
    </tr>
  </tbody>
  <% end %>
</table>
<div class="m_t_30">
  <ul><%= paginate(@paginated_array) %></ul>
</div> 

넘어지는 장면


나는 음반을 조합해서 보여주고 싶을 때의 페이지 스타일을 어떻게 실현해야 할지 모르겠다.

예제


예를 들어 사용자를 목록에 표시할 때, 사용자마다country열의 값에 따라 그룹을 나누어 목록을 표시할 수 있습니다.
이 화면에서 사용자에게 페이지 스타일을 사용하는 데 사용될 것을 구상했다.

app/controllers/users_controller.rb
def index
  # 全てのユーザーを取得し、countryカラムの文字コード順に並べ替える
  users = User.all.order(country: "DESC").order(id: "ASC")
  @users_hash = users.gruop_by {|user| user.country}
end

app/views/users/index.html.erb
<table>
  <thead>
    <tr>
      <th>国別一覧</th>
    </tr>
  </thead>

  <tbody>
    <% @users_hash.keys.each do |country| %>
      <% users = @users_hash[country] %>
        <tr>
          <th><%= country %>グループ</th>
        </tr>
        <% users.each do |user| %>
        <tr>
          <td><%= user.name %></td>
        </tr>
      <% end %>
    <% end %>
  </tbody>
</table>

그룹을 나누기 위해 그룹을 진행합니다사용하다
gruop_하면, 만약, 만약...
블록의 계산 결과를 키워드로 하고 원소의 배열을 값으로 해서 해시 값을 되돌릴 수 있습니다.
참조 안내서
방금 세그먼트에 페이지 스타일을 사용할 때, 세그먼트에 모든 사용자가 저장한 데이터를 추가한 해시.
따라서 users.lengthKaminari.paginate_array(array).length의 결과는 일치한다.(페이지당 항목 수는 25로 묵인하여users.length<25시)
그러나 이번 상황은 해시의 키value를 배열된 값으로 계산한다aray[{key1, [value1, value2]},{key2,[value3, value4, value5]}...]에 놓으면 해시의 키와 같은 수량(수조의 원소수)은 페이지의 연결 문자입니다.

pp/controllers/users_controller.rb
def index
~~

array = [{key1, [value1, value2]},{key2,[value3, value4, value5]}...]
@paginated_array = Kaminari.paginate_array(array).page(params[:page]).per(10)
이렇게 하면 키는 반드시 10항 이상이어야만 페이지 연결 문자를 사용하지 않을 수 있다.
이번 경우value는 10항 이상에서 페이지 단자를 하려고 하기 때문에 원하는 출력을 얻을 수 없습니다.

해결책


다음과 같은 설치를 통해 해결되었습니다.
app/controllers/users_controller.rb
 def index
    page = params[:page] || 1
    @users = User.all.order(country: "DESC").order(id: "ASC").page(page).per(15)
    @users_hash = @users.group_by {|user| user.country}
  end
app/views/users/index.html.erb
<table>
  <thead>
    <tr>
      <th>国別一覧</th>
    </tr>
  </thead>

  <tbody>
    <% @users_hash.keys.each do |country| %>
      <% users = @users_hash[country] %>
        <tr>
          <th><%= country %>グループ</th>
        </tr>
        <% users.each do |user| %>
        <tr>
          <td><%= user.name %></td>
        </tr>
      <% end %>
    <% end %>
  </tbody>
</table>

<div class="m_t_30">
  <ul><%= paginate(@users) %></ul>
</div>
상술한 출력은 다음과 같습니다. 목표로서의 출력을 얻었습니다!
첫 페이지

페이지 2

참고 자료

  • kaminari
  • 루비 참조 안내서
  • [rails] 카미나리로 페이지 제작
  • kaminari를 사용하여 배열에 사용할 페이지 나누기를 만듭니다
  • 좋은 웹페이지 즐겨찾기