Ruby on Rails — Есть ли у ActsAsList известные проблемы при работе с nested_attributes?

#ruby-on-rails #ruby #acts-as-list

#ruby-on-rails #ruby #действует как список

Вопрос:

У меня возникла проблема при обновлении позиций acts_as_list с помощью nested_attributes, я прошел свой путь вниз и заметил, что проблема все еще возникает на уровне модели (как показано ниже). Проблема возникает при создании объекта nested_attribute и замене другого объекта в его позиции. Кто-нибудь сталкивался с подобными проблемами или указывал мне правильное направление, пожалуйста?

Настройка:

 class List < ActiveRecord
  has_many :list_items, -> { order(position: :asc) }, dependent: :destroy, inverse_of: :list
  accepts_nested_attributes_for :list_items, reject_if: :all_blank, allow_destroy: true
end

class ListItem < ActiveRecord
  acts_as_list scope: [:list_id, { deleted_at: nil }]
  belongs_to :list, inverse_of: :list_items
end
 

Проблема:
Проблема, с которой я сталкиваюсь, заключается в создании нового list_item вместо существующего.

Пример:

 list = ListItem.create
list.list_items.create(name: 'Item 1')
list.list_items.create(name: 'Item 2')

#ListItems output
list.list_items.first.position #=> 1
list.list_items.last.position #=> 2

# Re-Order
new_item = list.list_items.build(name: 'New Item 2', position: 2)
list.list_items.second.position = 3

#Output 
list.list_items.first.position #=> 1
list.list_items.second.position #=> 3
list.list_items.last.position #=> 2

list.save

#Output 
list.list_items.first.position #=> 1
list.list_items.second.position #=> 3
list.list_items.last.position #=> 2
 

На данный момент все работает нормально, однако, когда я перезагружаю «список» из базы данных, я получаю странную проблему… (элементы списка упорядочиваются по ‘id’ по умолчанию для этого примера)

 list.reload

#Output 
list.list_items.first.position #=> 1
list.list_items.second.position #=> 4
list.list_items.last.position #=> 2
 

После тестирования кажется, что позиции элементов ниже вновь вставленных элементов отключены на количество вновь вставленных элементов.

Кто-нибудь сталкивался с такой же проблемой и обнаружил проблему либо в коде самого acts_as_list ?

Заранее благодарю вас за любую помощь

Ответ №1:

Просто взглянув на ваш код, у вас есть двойная запятая в вашем определении has_many:

 has_many :list_items, , -> { order(position: :asc) }, dependent: :destroy, inverse_of: :list
 

Удалите лишнюю запятую и посмотрите, что произойдет. Я предполагаю, что порядок не применяется, потому что он не предоставляется, и Rails молча игнорирует процедуру.

Комментарии:

1. Спасибо, это была опечатка. Я удалил двойную запятую, но, к сожалению, ведет себя так же

2. Может потребоваться перезагрузка list.list_items после добавления элементов. В этом случае вы, вероятно, не можете полагаться на .second актуальность. Также попробуйте запустить код в вашем примере, потому что у вас есть еще одна опечатка в первой строке list = ListItem.create . Просто чтобы убедиться, что это реальный код, который терпит неудачу. Вероятно, лучше всего отсюда было бы клонировать репозиторий acts_as_list GitHub и выполнить неудачный тест, а затем вызвать его как запрос на извлечение для меня.