Ruby on Rails - 从最后一个对象递增 1
Ruby on Rails - Increment by 1 from last object
我正在构建一个用户图库 应用程序,用户可以在其中创建相册并将图像上传到他们的相册。我正在使用 nested forms
图片。
在我的 images
数据库中,我有一个名为 sort_order
的列。我想使用 sort_order
来管理排序和显示用户,例如:他正在查看 12 张图片中的 3 张,其中 3是 sort_order
的数量,12 是该相册中的图像总数。
sort_order
是 integer
和 default: 0
。我要寻找的是根据同一相册中最后一张图片的 上一张 sort_order
增加/increment
每张图片的 sort_order
数量。
例如:图像 1 将具有 sort_order: 1
,图像 2 将具有以前的图像 sort_id +1
=> sort_order: 2
等等。
这是我现在使用的代码:
after_create :previous_image
def previous_image
img = user.images.order("id ASC")
img.each do |image|
image.increment!(:sort_order, self.sort_order + 1)
end
end
这确实有效,但排序错误。
id sort_order
10 3
11 2
12 1
不是 id: 10
sort_order: 1
,而是 3
。
这是日志:
SQL (0.5ms) UPDATE "images" SET "sort_order" = ?, "updated_at" = ? WHERE "images"."id" = ? [["sort_order", 1], ["id", 398]]
user Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 160]]
Slide Load (0.1ms) SELECT "images".* FROM "images" WHERE "images"."user_id" = ? ORDER BY id DESC [["user_id", 160]]
SQL (0.1ms) UPDATE "images" SET "sort_order" = ?, "updated_at" = ? WHERE "images"."id" = ? [["sort_order", 1], ["id", 399]]
SQL (0.1ms) UPDATE "images" SET "sort_order" = ?, "updated_at" = ? WHERE "images"."id" = ? [["sort_order", 2], ["id", 398]]
user Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 160]]
Slide Load (0.1ms) SELECT "images".* FROM "images" WHERE "images"."user_id" = ? ORDER BY id DESC [["user_id", 160]]
SQL (0.1ms) UPDATE "images" SET "sort_order" = ?, "updated_at" = ? WHERE "images"."id" = ? [["sort_order", 1], ["id", 400]]
SQL (0.1ms) UPDATE "images" SET "sort_order" = ?, "updated_at" = ? WHERE "images"."id" = ? [["sort_order", 2], ["id", 399]]
SQL (0.1ms) UPDATE "images" SET "sort_order" = ?, "updated_at" = ? WHERE "images"."id" = ? [["sort_order", 3], ["id", 398]]
它从底部而不是顶部开始。我该如何解决?
如果没有 sort_order
列还有其他方法,我愿意接受。
收到表单数据后,给images数组添加索引(从1开始)
考虑到这是来自以下形式的图像数组:
images = [{name: 'Image 1', data: 123}, {name: 'Image 2', data: 456}]
使用with_index(1)
将排序顺序附加到每个元素:
images.map.with_index(1).to_a
=> [[{:name=>"Image 1", :data=>123}, 1], [{:name=>"Image 2", :data=>456}, 2]]
我正在构建一个用户图库 应用程序,用户可以在其中创建相册并将图像上传到他们的相册。我正在使用 nested forms
图片。
在我的 images
数据库中,我有一个名为 sort_order
的列。我想使用 sort_order
来管理排序和显示用户,例如:他正在查看 12 张图片中的 3 张,其中 3是 sort_order
的数量,12 是该相册中的图像总数。
sort_order
是 integer
和 default: 0
。我要寻找的是根据同一相册中最后一张图片的 上一张 sort_order
增加/increment
每张图片的 sort_order
数量。
例如:图像 1 将具有 sort_order: 1
,图像 2 将具有以前的图像 sort_id +1
=> sort_order: 2
等等。
这是我现在使用的代码:
after_create :previous_image
def previous_image
img = user.images.order("id ASC")
img.each do |image|
image.increment!(:sort_order, self.sort_order + 1)
end
end
这确实有效,但排序错误。
id sort_order
10 3
11 2
12 1
不是 id: 10
sort_order: 1
,而是 3
。
这是日志:
SQL (0.5ms) UPDATE "images" SET "sort_order" = ?, "updated_at" = ? WHERE "images"."id" = ? [["sort_order", 1], ["id", 398]]
user Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 160]]
Slide Load (0.1ms) SELECT "images".* FROM "images" WHERE "images"."user_id" = ? ORDER BY id DESC [["user_id", 160]]
SQL (0.1ms) UPDATE "images" SET "sort_order" = ?, "updated_at" = ? WHERE "images"."id" = ? [["sort_order", 1], ["id", 399]]
SQL (0.1ms) UPDATE "images" SET "sort_order" = ?, "updated_at" = ? WHERE "images"."id" = ? [["sort_order", 2], ["id", 398]]
user Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 160]]
Slide Load (0.1ms) SELECT "images".* FROM "images" WHERE "images"."user_id" = ? ORDER BY id DESC [["user_id", 160]]
SQL (0.1ms) UPDATE "images" SET "sort_order" = ?, "updated_at" = ? WHERE "images"."id" = ? [["sort_order", 1], ["id", 400]]
SQL (0.1ms) UPDATE "images" SET "sort_order" = ?, "updated_at" = ? WHERE "images"."id" = ? [["sort_order", 2], ["id", 399]]
SQL (0.1ms) UPDATE "images" SET "sort_order" = ?, "updated_at" = ? WHERE "images"."id" = ? [["sort_order", 3], ["id", 398]]
它从底部而不是顶部开始。我该如何解决?
如果没有 sort_order
列还有其他方法,我愿意接受。
收到表单数据后,给images数组添加索引(从1开始)
考虑到这是来自以下形式的图像数组:
images = [{name: 'Image 1', data: 123}, {name: 'Image 2', data: 456}]
使用with_index(1)
将排序顺序附加到每个元素:
images.map.with_index(1).to_a
=> [[{:name=>"Image 1", :data=>123}, 1], [{:name=>"Image 2", :data=>456}, 2]]