任意に並び替えがしたいナリ、とお客さんに言われたので、acts_as_listを使ってみた。
使い方はほぼこちらの通りでOK。簡単簡単。
http://tobysoft.net/wiki/index.php?Ruby%2FRuby%20on%20Rails%2Facts_as_list
最初あるいは最後のエントリかどうかは、model.first?とかmodel.last?で取れる(view内でとても便利)。ただし常時n+1問題が発生するので、頻繁に並び替えるような用途では危険。

ついでに、ソートしてpositionを付け直す機能の実装でちょっと悩む。
普通にmove_to_bottomを使って

items.each do |item|
item.move_to_bottom
end

とかやると、positionの値が現在の最後+1から付け直されてしまう(当たり前だけど)。機能的には何ら問題ないけど、ソートするごとにpositionが増えていって気持ち悪い。
acts_as_listのソースを読んで、


items.each_with_index do |item, index|
item.insert_at(index+1)
end

なんてコードを書いてみたら、positionが[1,1,1,1,5,5,5…]みたいな面白い並びになってしまった。ガッデム。
色々試行錯誤したけど、単純に


items.each_with_index do |item, index|
item.update_attributes(:position => index + 1)

end

で良かった。KISSですな。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>