0

私はこのようにacts_as_list v0.9.17を使用しています:

class ListItem < ActiveRecord::Base
  acts_as_list scope: [:column1_id, :column2_id], :add_new_at => :bottom
end

新しい (範囲指定された)@list_itemが作成されると、たとえば、column1_idis 1column2_idis 11、およびcolumn3_idis37の場合、データベースは予想どおり次のようになります。

id  | position | column1_id | column2_id | column3_id
--- | -------- | ---------- | ---------- | ----------
750 | 1        | 1          | 11         | 89
751 | 2        | 1          | 11         | 56
752 | 3        | 1          | 11         | 105
753 | 4        | 1          | 11         | 25
754 | 5        | 1          | 11         | 37

ただし、 a@list_itemが破棄されると、たとえばcolumn1_idis 1column2_idis 11、およびcolumn3_idis 56(record id 751) が破棄されると、データベースは次のようになります。

id  | position | column1_id | column2_id | column3_id
--- | -------- | ---------- | ---------- | ----------
750 | 1        | 1          | 11         | 89
752 | 3        | 1          | 11         | 105
753 | 4        | 1          | 11         | 25
754 | 5        | 1          | 11         | 37

のギャップがあるということですposition 2

ギャップを防止または調整する方法は?つまり、リスト項目が破棄されたときにリスト項目の並べ替えを処理する方法は?


注:位置を変更してリストを並べ替えるメソッドがあることは知っていますが、それらを使用して問題を解決するかどうか、およびどのように使用するかはわかりません(おそらく何らかの方法で使用しますremove_from_list)。

4

1 に答える 1

0

あなたが提供した方法を使用する必要があると言うように、コントローラーまたはモデル自体でそれを行うことができます。あなたがコールバックが好きな人なら、次のようにします。

class ListItem < ActiveRecord::Base
  acts_as_list scope: [:column1_id, :column2_id], :add_new_at => :bottom
  before_destroy { |record| record.remove_from_list }

  ....
end

そのようなロジックをコールバックとして処理するのを好まない人もいるので、コントローラに直接追加することもできます。

class ListItemsController < Wherever
  ....
  ....

  def destroy
    @list_item.remove_from_list
    @list_item.delete

    ....
  end
end

個人的にはモデルに追加しますが、どちらも同じことをします。

レコードが欠落しているリストを修正する必要がある場合、ID と位置が 0 ~ 4 および 6 ~ 9 で、位置が 5 ではない LineItems があるとします。コンソールで次のように汚い修正を行うことができます。

LineItem.where('position >= ?', 5).each { |line_item| line_item.update_attributes(position: line_item.position - 1) }

これにより、位置が 4 を超えるすべての LineItem が検出され、それぞれが 1 ずつ減らされ、0 から 8 までの正しい順序のリストが残ります。

于 2019-04-06T23:58:38.760 に答える