Ruby on rails 在Rails中创建可拖动可排序列表的最有效方法是什么?
我想创建可拖动的有序列表,但根据acts_as_lists,gem是非常服务器密集型的,它还表示构建失败。他们建议使用排名模型gem,但它似乎已被弃用 那么,当有许多用户重新排列列表时,在不造成服务器巨大负载的情况下,最有效的方法是什么呢 对于每个项目,都有一个排序字段来指定排序(1到n)。一旦用户完成了可拖动排序,排序将以数组形式发布到Rails后端,例如[1、5、3、6、2、4]。数组中的数字是项目的id。基于此数组,我可以更新排序字段。例如,数组中的第一项(id=1)的顺序为1,第二项(id=5)的顺序为2。稍后,您可以使用订购(“订购ASC”)进行订购 首先,有一个排序视图(路径为“获取项目/排序”),供用户进行可拖动排序。它看起来像这样(以超薄格式): 表单用于保留排序数组,并允许将数据发布到Rails Javascript(CoffeeScript)如下所示:Ruby on rails 在Rails中创建可拖动可排序列表的最有效方法是什么?,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我想创建可拖动的有序列表,但根据acts_as_lists,gem是非常服务器密集型的,它还表示构建失败。他们建议使用排名模型gem,但它似乎已被弃用 那么,当有许多用户重新排列列表时,在不造成服务器巨大负载的情况下,最有效的方法是什么呢 对于每个项目,都有一个排序字段来指定排序(1到n)。一旦用户完成了可拖动排序,排序将以数组形式发布到Rails后端,例如[1、5、3、6、2、4]。数组中的数字是项目的id。基于此数组,我可以更新排序字段。例如,数组中的第一项(id=1)的顺序为1,第二项(i
sortable_element = document.getElementById('items-sortable')
if sortable_element
$(sortable_element).sortable({
placeholder: "<div style='border-style: dashed'> </div>"
})
.bind('sortupdate', (e, ui) ->
orders = ui.endparent.children().map( -> return $(this).data("id") ).toArray()
document.getElementById('items_ids').value = JSON.stringify(orders)
)
def ordering
if (@orders = params[:items_ids]) && (@orders.present?)
@orders = JSON.parse(params[:items_ids])
if @orders.kind_of?(Array) && @orders.size > 0
# Let build hash for mass update
data = {}
@orders.each_with_index do |iden, index|
data[iden] = {ordering: index}
end
Item.all.update(data.keys, data.values) # still update one-by-one at backend
end
end
respond_to do |format|
format.html { redirect_to items_path }
end
end
如果您不想使用表单,可以尝试使用AJAX对其进行转换。您可以使用。这是我计划使用的,但我需要一种方法来更新数据库,我不确定如何有效地进行转换。就像这个rails cast用jQuery显示了acts_as_列表gem,但我想要一种更有效的方式,比如排名模型。jQuery拖放并强制用户在对列表的排列感到满意后单击保存按钮。这会起作用。你知道我在哪里能找到这方面的指南吗。我假设我会使用像rails那样的acts_as_列表,但我知道如何停止自动更新并强制用户以某种方式保存。
def ordering
if (@orders = params[:items_ids]) && (@orders.present?)
@orders = JSON.parse(params[:items_ids])
if @orders.kind_of?(Array) && @orders.size > 0
# Let build hash for mass update
data = {}
@orders.each_with_index do |iden, index|
data[iden] = {ordering: index}
end
Item.all.update(data.keys, data.values) # still update one-by-one at backend
end
end
respond_to do |format|
format.html { redirect_to items_path }
end
end