gpt4 book ai didi

ruby-on-rails - 当使用 update_attributes 更新资源时,acts_as_list 是否应该自动重新排序项目?

转载 作者:行者123 更新时间:2023-12-02 02:21:53 24 4
gpt4 key购买 nike

我在 rails 3.1 中使用 acts_as_list 插件,每当我添加或删除资源时,现有位置都会被排序和更新。但是,当使用 update_attributes 更新资源的位置时,似乎没有发生重新排序,我可能会留下具有重复位置的资源。这是 acts_as_list 的正确行为吗?

我搜索了相关说明,但有关此插件的文档非常有限。

我在这个阶段没有使用 javascript,位置只是用一个范围适当限制的选择框来确定。

谢谢

最佳答案

更新对象时,插件中没有任何内容会被调用。您必须使用 acts_as_list 提供的内置方法手动执行此操作。

此插件的 ruby​​ 文件只有 300 行且易于理解,它会告诉您有关 acts_as_list 的所有信息...老实说,内容并不多:https://github.com/swanandp/acts_as_list/blob/master/lib/acts_as_list/active_record/acts/list.rb

要手动执行此操作,只需获取位置高于当前项目的所有项目并递增每个项目。这就是我在我的应用程序中处理它的方式(不使用 acts_as_list 但概念在那里)。这是订购论坛的示例:

forum.rb

PositionOptions = [["First Forum", "-1"]] + all.map{|forum| ["After #{forum.subject}", forum.position]}

attr_accessor :position_before
before_save :set_position, :if => "position_before.present?"
def set_position
self.position = position_before.to_i + 1
end

after_save :do_positions, :if => "position_before.present?"
def do_positions
Forum.where('position >= ? AND id != ?', position, id).order('position, updated_at DESC').all.each_with_index do |forum, index|
forum.update_attribute('position', position + index + 1)
end
end

查看

<% position_options = Forum::PositionOptions %>
<%= f.select :position_before, position_options.reject {|forum| @forum.position == forum[1]}, :selected => position_options[position_options.index {|p| p[1] == @forum.position} - 1][1] %>

也许不是最好的方法,但这是我能想到的最好的方法。如果您计划经常更新位置,或者如果有很多对象被定位,它可能会太昂贵......但它适用于像论坛这样的小型集合。

关于ruby-on-rails - 当使用 update_attributes 更新资源时,acts_as_list 是否应该自动重新排序项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7767457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com