2015-04-12 109 views
0

我有一个对象的任务列表上对象的数组,你可以看到如下:如何重新排序的IDS

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

我想要做的是重排序依据,我发现了IDS对象的数组。我想要做的是将所有顺序设置为0,然后分别在矩阵中搜索每个对象并相应地设置它们的优先级。但这只是感觉错误...感觉到计算密集。

有一个聪明的办法做这样的事情:

ArrayOfTaskObjects.orderbyAttribute(ID)?

回答

0

也许最简单的方法是用一个指标来迭代的参数,可以是这样的:

params['task_ids'].split(",").each_with_index do |task_id, idx| 
    task = lookup_the_task_based_on_id 
    task.order = idx 
end 
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方法接受对象的数组 - 这是你的任务数组。

在代码的第一行中创建了一个散列,它将每个任务id存储为关键字,将Task对象存储为该值。

第二行代码根据键对hash进行排序(请注意,r.sort_by方法返回一个二维数组,例如[[23, Task], [44, Task], [54, Task]])。

最后,第三行代码将您的二维数组平滑为一维数组,greps从二维数组中移除所有的id,然后依次保留Tasks数组。