プラグインには、オブジェクトが更新されたときに呼び出されるものはありません。Acts_as_listが提供する組み込みメソッドを使用して手動で行う必要があります。
このプラグインのrubyファイルはわずか300行で、簡単に追跡できます。acts_as_listについて知っておくべきことがすべてわかります...正直なところ、それほど多くはありません:https ://github.com/swanandp/acts_as_list/blob/ master / lib / acts_as_list / active_record / acts / list.rb
手動で行うには、現在のアイテムよりも高い位置にあるすべてのアイテムを取得し、それぞれをインクリメントします。これが私のアプリでの処理方法です(acts_as_listを使用していませんが、概念はそこにあります)。これは、フォーラムを注文するための例です。
forum.rb
PositionOptions = [["First Forum", "-1"]] + all.map{|forum| ["After #{forum.subject}", forum.position]}
attr_accessor :position_before
before_save :set_position, :if => "position_before.present?"
def set_position
self.position = position_before.to_i + 1
end
after_save :do_positions, :if => "position_before.present?"
def do_positions
Forum.where('position >= ? AND id != ?', position, id).order('position, updated_at DESC').all.each_with_index do |forum, index|
forum.update_attribute('position', position + index + 1)
end
end
見る
<% position_options = Forum::PositionOptions %>
<%= f.select :position_before, position_options.reject {|forum| @forum.position == forum[1]}, :selected => position_options[position_options.index {|p| p[1] == @forum.position} - 1][1] %>
おそらくそれを行うための最良の方法ではありませんが、それは私が思いつくことができた最良の方法でした。位置が頻繁に更新されることを計画している場合、または配置されるオブジェクトが多数ある場合は、おそらく高額になります...しかし、フォーラムなどの小さなコレクションでは機能します。