acts_as_list

順番の制御が楽にできるらしいRailsのacts_as_listだがupdateのコストが高そう…

class Hoge < ActiveRecord::Base
  belongs_to :grouping
  acts_as_list :scope => :grouping_id
end

acts_as_listのソース

def increment_positions_on_lower_items(position)
  acts_as_list_class.update_all(
    "#{position_column} = (#{position_column} + 1)", "#{scope_condition} AND #{position_column} >= #{position}")
end

例えばグループ4の3番目の位置に新しいインサートすると

UPDATE table SET position = position + 1 WHERE grouping_id = 4 AND position > 3;

みたいなSQLを実行して、3以下のやつを下に移動させる。updateコストがちと心配だが、コストが問題になるほど大量のレコードをacts_as_listで扱うことは無いのだろうな…、というか扱わないように注意