3

rails 3.1でacts_as_listプラグインを使用しており、リソースを追加または削除するたびに、既存の位置が正常に順序付けられ、更新されます。ただし、update_attributesを使用してリソースの位置を更新すると、並べ替えが行われないように見え、位置が重複しているリソースが残る可能性があります。これはacts_as_listの正しい動作ですか?

説明を探しましたが、このプラグインに関するドキュメントは本当に限られています。

この段階ではJavaScriptを使用していません。位置は、適切に制限された範囲を持つ選択ボックスを使用して簡単に決定されます。

ありがとう

4

2 に答える 2

2

プラグインには、オブジェクトが更新されたときに呼び出されるものはありません。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] %>

おそらくそれを行うための最良の方法ではありませんが、それは私が思いつくことができた最良の方法でした。位置が頻繁に更新されることを計画している場合、または配置されるオブジェクトが多数ある場合は、おそらく高額になります...しかし、フォーラムなどの小さなコレクションでは機能します。

于 2011-10-14T12:30:39.403 に答える
0

これを処理するには、has_many属性のライターをオーバーライドして、最初にリストをクリアします。たとえば、Photoがacts_as_listである場合、参照クラスのライターをオーバーライドします。

def photos_with_clear=(photos)
  self.photos_without_clear=[]
  self.photos_without_clear=photos
end
alias_method_chain :photos=, :clear

写真コレクションが設定されるたびに写真がクリアされて再作成されるため、これは明らかに非常に非効率的ですが、両方update_attributes(:photos=>[<Photo 1>, <Photo 2>])またはupdate_attributes(:photo_ids=>[123, 456])(少なくともレール2.3.18では)で作業できるという利点があります。

于 2013-05-08T20:19:10.623 に答える