2015-04-12 111 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數組。