Rails gem acts_as_list: Как справиться с переупорядочением элементов списка, когда элемент списка уничтожен? - PullRequest
0 голосов
/ 07 апреля 2019

Я использую 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_id это 1, column2_id равно 11, а column3_id равно 37, база данных выглядит следующим образом, как и ожидалось:

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

Однако, когда @list_item уничтожается, скажем, одингде column1_id равно 1, column2_id равно 11 и column3_id равно 56 (идентификатор записи 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).

1 Ответ

0 голосов
/ 07 апреля 2019

Как вы говорите, вам нужно использовать предоставленный вами метод, и вы можете сделать это либо в своем контроллере, либо в самой модели. Если вы тот парень, которому нравятся обратные вызовы, то:

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

Лично я бы добавил это в модель, но они оба делают одно и то же.

Если вам нужно исправить список с отсутствующей записью, скажите, что у вас есть LineItems с идентификатором и позициями 0-4 и 6-9, отсутствующей позицией 5. Вы можете сделать грязное исправление в консоли с:

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

Это найдет все LineItems с позицией более 4 и уменьшит каждый из них на единицу, оставляя вас с правильно упорядоченным списком от 0 до 8.

...