2016-06-01 71 views
1

這裏是場景,我有這些對象。讓我們假設這是一個User移動軌道中的對象集合中的一個對象

對象來自何處:

@user = User.all 

用戶對象

[<#User id: 1, firstname: "John", lastname: "Pond">,<#User id: 2, firstname: "Paul", lastname: "Rich">,<#User id: 3, firstname: "Jasmine", lastname: "Ong">] 

如何我可以移動一個對象了,比如我想移動User.id == 2?我想要的結果如下所示。

[<#User id: 2, firstname: "Paul", lastname: "Rich">,<#User id: 1, firstname: "John", lastname: "Pond">,<#User id: 3, firstname: "Jasmine", lastname: "Ong">] 
+0

你想在'ActiveRecord關係對象'或將其轉換爲'數組'是好嗎? –

+0

我已經解決了這個問題。我在下面發佈了我的答案。 – HashRocket

回答

1

我已經得到了答案。這是我爲了讓我的問題達到上述目的而做的。

@users = User.all 
user_ids = User.pluck(:id) 
user_ids.delete(2) 
new_user_ids = [2] 

user_ids.each do |id| 
    new_user_ids << id 
end 

@users.sort_by { |user| new_user_ids.index(user.id) } 

這使得完美!

-1

我們也可以這樣做:

給Array添加一個新方法。 LIB/rails_extensions.rb

class Array 

    def swap!(a, b = a - 1) 
      self[a], self[b] = self[b], self[a] 
     self 
    end 

end 

然後在到config/environment.rb

require 'rails_extensions' 

添加此所以我們可以使用數組的方法swap!,它將交換的對象與之前的一個。我們可以這樣做:

@users = User.all #[<#User id: 1>, <#User id: 2>] 
user_id = @users.rindex {|user| user.id == 2} 
@users = @users.swap!(user_id) #[<#User id: 2>, <#User id: 1>] 
+0

你只是交換對象。而你的代碼不靈活。對象中只有2個。如果我有更多的100個呢?你的意思是我修改交換!方法?我在下面的答案就夠了。 – HashRocket

+0

你的問題是關於移動一個對象?那麼如果你想要更多的靈活性,爲什麼不只是把arg'b = a - 1'改成'b',所以我們可以交換到我們想要的任何索引? – pyfl88

-1

這是不是太難看了?

hash = [{ id: 1}, {id: 2}, {id: 3}] 
hash.unshift(hash.delete(hash.select {|h| h[:id] == 2 }.first)) 
=> [{:id=>2}, {:id=>1}, {:id=>3}] 
+0

不對一個id進行排序,它是對象集合中的整個User對象。 – HashRocket

相關問題