gpt4 book ai didi

javascript - 如何在 Rails 中将拖放项目的顺序保存到数据库中?

转载 作者:数据小太阳 更新时间:2023-10-29 09:02:18 25 4
gpt4 key购买 nike

我正在使用 Jquery Shapeshift用于拖放我的一些列表。

我有一个包含 list_id 及其位置的 javascript 数组。每次我移动列表时,该数组都会发送到我的 Controller 。所以我需要做的就是获取该数据并将其保存到我数据库中的位置字段。每个列表都有其顺序的位置字段。

下面是包含 list_id 及其在每个列表中的位置的数组。每次我将列表拖到不同的位置时,它都会发送到我的名为排序列表的 Controller 操作。

Parameters: {"position"=>"[[\"list_46\",0],[\"list_45\",1],
[\"list_38\",2],[\"list_44\",3],[\"list_39\",4],[\"list_37\",5]]"}

那么我如何获取上面的信息并更新每个列表的位置字段。

def sortlists
params[:position]
render nothing: true
end

同样,一切都已经设置好了,我只需要知道如何使用数组中的内容来更新列表。

我试过了,还是不行。

def sortlists
params[:position].each_with_index do |id, index|
List.where(id: id).update_all({position: index+1})
end

render nothing: true
end


编辑(这是我现在拥有的)

查看

<div class="container listwrap">
<% @lists.each do |list| %>
<div class="list" data-item-id="<%= list.id %>">

<div class="list-title"> <%= list.title %></div>

</div>
<% end %>
</div>

Javascript

jQuery(function() {
$('.listwrap').shapeshift();
$('.listwrap').on('ss-rearranged', function(e) {
order = [];
$(this).children().each(function() {
order.push([$(this).attr("data-item-id"), $(this).index() ]);
});
$.post('/boards/sortlists',
{order: JSON.stringify(order)},
function(data, status, jqXHR) {
// This is what gets rendered from your rails controller + action
});
});
});

Controller

def sortlists
items_to_update = JSON::parse(params[:order]).map{|item| [item[0], {position: item[1]}]}
items_hash_to_update = items_to_update.to_h
List.update(items_hash_to_update.keys, items_hash_to_update.values)
render nothing: true
end

每次拖动列表时 Rails Terminal

每次我移动列表时,它都会在我的 Controller 中运行 sortlists 方法。现在,正如您在参数中看到的那样,我有 list_id,然后是正确的位置。然后它会更新所有内容,但位置最终会出错。它们没有更新为参数所说的应该是什么。它似乎还运行了两次,我不知道为什么?

Parameters: {"order"=>"[[\"48\",0],[\"49\",1]]"}
Parameters: {"order"=>"[[\"48\",0],[\"49\",1]]"}
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]]
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]]
List Load (0.2ms) SELECT "lists".* FROM "lists" WHERE "lists"."id" = $1 LIMIT 1 [["id", 48]]
List Load (0.2ms) SELECT "lists".* FROM "lists" WHERE "lists"."id" = $1 LIMIT 1 [["id", 48]]
(0.2ms) BEGIN
(0.2ms) BEGIN
SQL (0.2ms) UPDATE "lists" SET "position" = $1, "updated_at" = $2 WHERE "lists"."id" = $3 [["position", 1], ["updated_at", "2015-09-09 01:15:27.117822"], ["id", 48]]
SQL (0.2ms) UPDATE "lists" SET "position" = $1, "updated_at" = $2 WHERE "lists"."id" = $3 [["position", 1], ["updated_at", "2015-09-09 01:15:27.117822"], ["id", 48]]
(0.2ms) SELECT COUNT(*) FROM "lists" WHERE "lists"."board_id" = $1 AND (position = 1) [["board_id", 11]]
(0.2ms) SELECT COUNT(*) FROM "lists" WHERE "lists"."board_id" = $1 AND (position = 1) [["board_id", 11]]
SQL (0.2ms) UPDATE "lists" SET position = (position + 1) WHERE "lists"."board_id" = $1 AND (position >= 1) AND (position < 2 AND id != 48) [["board_id", 11]]
SQL (0.2ms) UPDATE "lists" SET position = (position + 1) WHERE "lists"."board_id" = $1 AND (position >= 1) AND (position < 2 AND id != 48) [["board_id", 11]]
(13.9ms) COMMIT
(13.9ms) COMMIT
List Load (0.2ms) SELECT "lists".* FROM "lists" WHERE "lists"."id" = $1 LIMIT 1 [["id", 49]]
List Load (0.2ms) SELECT "lists".* FROM "lists" WHERE "lists"."id" = $1 LIMIT 1 [["id", 49]]
(0.1ms) BEGIN
(0.1ms) BEGIN
SQL (0.3ms) UPDATE "lists" SET "position" = $1, "updated_at" = $2 WHERE "lists"."id" = $3 [["position", 1], ["updated_at", "2015-09-09 01:15:27.141404"], ["id", 49]]
SQL (0.3ms) UPDATE "lists" SET "position" = $1, "updated_at" = $2 WHERE "lists"."id" = $3 [["position", 1], ["updated_at", "2015-09-09 01:15:27.141404"], ["id", 49]]
(0.3ms) SELECT COUNT(*) FROM "lists" WHERE "lists"."board_id" = $1 AND (position = 1) [["board_id", 11]]
(0.3ms) SELECT COUNT(*) FROM "lists" WHERE "lists"."board_id" = $1 AND (position = 1) [["board_id", 11]]
SQL (0.3ms) UPDATE "lists" SET position = (position + 1) WHERE "lists"."board_id" = $1 AND (position >= 1) AND (position < 2 AND id != 49) [["board_id", 11]]
SQL (0.3ms) UPDATE "lists" SET position = (position + 1) WHERE "lists"."board_id" = $1 AND (position >= 1) AND (position < 2 AND id != 49) [["board_id", 11]]
(9.0ms) COMMIT
(9.0ms) COMMIT

最佳答案

如果您将以下数据发送到服务器/ Controller

Parameters: {"position"=>"[[\"list_46\",0],[\"list_45\",1],
[\"list_38\",2],[\"list_44\",3],[\"list_39\",4],[\"list_37\",5]]"}

如果您没有在update 模式下发送相应项目的id,则更新可能会出现问题。saving 没问题。

# To save the items
items_to_create = JSON::parse(params[:position]).map{|item| {list_name: item[0], order: item[1]}}
List.create(items_to_create)

更新,最好有列表项的ids,比如

Parameters: {"position"=>"[[1,\"list_46\",0],[2,\"list_45\",1],
[3,\"list_38\",2],[4,\"list_44\",3],[5,\"list_39\",4],[6,\"list_37\",5]]"}

这里,数组中的第一项是ids

items_to_update = JSON::parse(params[:position]).map{|item| [item[0],{list_name: item[1], order: item[2]}]}
items_hash_to_update = items_to_update.to_h
List.update(items_hash_to_update.keys, items_hash_to_update.values)

详情请见 https://cbabhusal.wordpress.com/2015/01/03/updating-multiple-records-at-the-same-time-rails-activerecord/

编辑 1

如果这是你在评论中所说的,那么原始参数可能有效,

Parameters: {"position"=>"[[\"list_46\",0],[\"list_45\",1],
[\"list_38\",2],[\"list_44\",3],[\"list_39\",4],[\"list_37\",5]]"}

以下代码可能会批量

更新您的数据
   items_to_update = JSON::parse(params[:position]).map{|item| [item[0].split('_').last, {order: item[2]}]}
items_hash_to_update = items_to_update.to_h
List.update(items_hash_to_update.keys, items_hash_to_update.values)

编辑2

对不起是我的错,本来应该是这样的

items_to_update = JSON::parse(params[:position]).map{|item| [item[0].split('_').last, {order: item[1]}]}

关于javascript - 如何在 Rails 中将拖放项目的顺序保存到数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32447491/

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