#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 и выполнить неудачный тест, а затем вызвать его как запрос на извлечение для меня.