gpt4 book ai didi

ruby-on-rails - 重构 LIst 排序方法的 Controller 代码

转载 作者:数据小太阳 更新时间:2023-10-29 07:54:43 27 4
gpt4 key购买 nike

使用排序列进行列表排序。函数运行良好,但我觉得必须有一种方法来重构这段代码,因为唯一的区别是一些变量赋值的运算符!

方法过去是分开的,所以设法稍微减少了代码,但这还不够!

一个方法将列表中的项目向上移动,向下方法将列表项目向下移动一个。 Swap方法就是交换列表中的位置。

我在模型范围内设置了顺序

  def up
return false if @dish == @section.dishes.first
swap('up', @dish, @section)
end

def down
return false if @dish == @section.dishes.last
swap('down', @dish, @section)
end

def swap(direction, dish, section)
dish_i = 0
section.dishes.each_with_index do |d, i|
dish_i = i - 1 if dish == d && direction == 'up'
dish_i = i + 1 if dish == d && direction == 'down'
end
dish2 = section.dishes[dish_i]
if direction == 'up'
dish2.sort += 1
dish.sort -= 1
elsif direction == 'down'
dish2.sort -= 1
dish.sort += 1
end
if @dish.save && dish2.save
redirect_to menu_path(params[:menu_id])
else
render :show
end
end

想减少代码,因为很多逻辑都是一样的

最佳答案

最简单的方法是使用 acts_as_list gem,它是成熟的、经过充分测试的,并且正是为此目的而设计的。

也就是说,我认为您可能有点想多了。您不需要做所有这些数学运算,也不需要获取该部分中的所有其他菜肴。您需要做的就是获取具有下一个更高/更低 sort 的 Dish 并交换两个 Dishes 的 sort:

def up
swap!(:up, @dish, @section)
end

def down
swap!(:down, @dish, @section)
end

def swap!(direction, dish, section)
condition = direction == :up ? 'sort > ?' : 'sort < ?'
asc_or_desc = direction == :up ? :desc : :asc
next_dish = section.dishes
.where(condition, dish.sort)
.order(sort: asc_or_desc)
.first

return false if next_dish.nil?

Dish.transaction do
next_dish.update!(sort: dish.sort)
dish.update!(sort: next_dish.sort)
end
end

关于组织代码的主题,代码 redirect_torender 代码应该放在您的 Controller 方法中(例如 update),而不是交换。就此而言,上面的所有代码可能属于您的模型,而不是您的 Controller :

class Dish < ApplicationRecord
# ...

def move_up!(section)
swap!(:up, section)
end

def move_down!(section)
swap!(:down, section)
end

def swap!(direction, section)
condition = direction == :up ? 'sort > ?' : 'sort < ?'
asc_or_desc = direction == :up ? :desc : :asc
next_dish = section.dishes
.where(condition, sort)
.order(sort: asc_or_desc)
.first

return false if next_dish.nil?

transaction do
next_dish.update!(sort: sort)
update!(sort: next_dish.sort)
end
end
end

然后在您的 Controller 方法中,您只需调用例如@dish.move_up!(@section)

关于ruby-on-rails - 重构 LIst 排序方法的 Controller 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57698177/

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