首页 > 解决方案 > Ruby on Rails - ActsAsList 在使用nested_attributes 时是否存在已知问题?

问题描述

我在使用nested_attributes 更新acts_as_list 位置时遇到问题,我一直在努力,发现问题仍然在模型级别发生(如下所示)。构建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 本身的代码中发现了问题?

预先感谢您的任何帮助

标签: ruby-on-railsrubyacts-as-list

解决方案


只需查看您的代码,您的 has_many 定义中有一个双逗号:

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

删除多余的逗号,看看会发生什么。我的猜测是订单没有被应用,因为它没有被提供并且 Rails 默默地忽略了 proc。


推荐阅读