WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

acts_as_listの使い方

      2015/08/12

acts_as_listとは

モデルオブジェクトの並び順を維持したり、並びを簡単に変更したりするためのプラグイン。

ブラウザ上でドラッグ・アンド・ドロップで並び替えを行うこともできる。

acts_as_listのインストール

$ gem install acts_as_list

もしくはGemfileに以下の一行を追加してbundle install

gem 'acts_as_list'

acts_as_listの動作確認環境の用意

動作確認用のデータベース設定

下記ページで動作確認ように用意したテーブルとデータを利用する。

acts_as_paranoidのインストールと使い方

acts_as_listではpositionという整数型のカラム名をソートの基準とするため、このカラムを加える。

$ rails generate migration AddPositionToPeople position:integer
$ rake db:migrate

モデルの編集

Groupモデルのhas_many :peopleにorder => :positionを追加。

class Group < ActiveRecord::Base
  acts_as_paranoid
  has_many :people, :dependent => :destroy, order => :position
end

続いて、Personモデルに acts_as_list :scope => :group の一行を追加。

class Person < ActiveRecord::Base
  acts_as_paranoid
  belongs_to :group
  acts_as_list :scope => :group
end

この一行により、Group毎に並び順を設定できるようになる。

また、rails consoleなどで以下のコマンドを実行して、動作確認用データを追加しておいた。

Person.create(:group_id => 1, :name => 'Mike', :age => 21, :sex => 1)
Person.create(:group_id => 1, :name => 'Oscar', :age => 38, :sex => 1)

ちなみに、当方の環境では、positionカラムの値がNULLの場合は後述するacts_as_listによって拡張されるmove_higherやmove_lowerなどのメソッドが動作しなかったので、rails dbconsole上で適当にupdate文を打って最初の順序を決めた。

コントローラとビューの生成

acts_as_listはその性質上、ブラウザでの操作を行なって動作確認をしたほうがいいので、動作確認用のコントローラとビューを用意する。

$ rails generate controller person sort

person_controller.rbの内容は以下のとおり。

class PersonController < ApplicationController
  def sort
    @people = Person.find_all_by_group_id(1, :order => 'position')
  end

  def move_higher
    Person.find(params[:id]).move_higher
    redirect_to :action => 'sort'
  end

  def move_lower
    Person.find(params[:id]).move_lower
    redirect_to :action => 'sort'
  end
end

ビューの内容は以下のとおり。


<% @people.each do |person| %>

<% end %>

ID GroupId Name 並び替え
<%= person.id %> <%= person.group_id %> <%= person.name %> <%= person.first? ? ' '.html_safe : link_to('↑', :action => ‘move_higher’, :id => person) %> <%= person.last? ? ' '.html_safe : link_to('↓', :action => ‘move_lower’, :id => person) %>
動作確認

PersonController#sortにアクセスして、↑や↓というリンクをクリックしてソートができればOK。

 - Ruby on Rails , ,