我有一个对象Task,如下所示:
class Task
include HTTParty
attr_accessor :id, :name, :assignee_status, :order
def initialize(id, name, assignee_status)
self.id = id
self.name = name
self.status = status
self.order = order
end
end
因此,当我加载任务列表时,我会给他们一个特定的顺序,如下所示:
i = 0
@tasks.each do |at|
at.order = i
i += 100
end
然后,此列表通过json发送到客户端应用程序,该应用程序向用户显示并允许拖放。在重新排序某个任务后,前端应用程序会将一个列表发送回服务器,其中包含新订单中的所有任务ID。
实施例: 23,45,74,22,11,98,23
我想要做的是根据我找到的ID重新排序对象数组。我想做的是将所有顺序设置为0,然后在矩阵上单独搜索每个对象并相应地设置它们的优先级。但这只是感觉不对......感觉计算密集。
是否有一种聪明的方法可以做到:
ArrayOfTaskObjects.orderbyAttribute(id)??
答案 0 :(得分:0)
也许简单的方法是用索引迭代params,例如:
params['task_ids'].split(",").each_with_index do |task_id, idx|
task = lookup_the_task_based_on_id
task.order = idx
end
答案 1 :(得分:0)
def sort_by_id(array)
r = array.inject({}) { |hash, element| hash.merge!(element.id => element) }
temp_array = r.sort_by {|k,_| k}
temp_array.flatten!.grep(temp_array.last.class)
end
发生了什么:
sort_by_id
方法接受一个对象数组 - 这就是你的Task数组。
在第一行代码中创建一个哈希,它将每个Task id存储为键,将Task对象存储为值。
第二行代码根据键对哈希进行排序(请注意,r.sort_by方法返回二维数组,例如[[23, Task], [44, Task], [54, Task]]
)。
最后,第三行代码将二维数组展平为一维数组,greps从二维数组中删除所有id,使得任务数组按顺序排列。