2016-06-01 77 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