在 rails 中的对象集合中移动一个对象

Move one object in collection of objects in rails

这是场景,我有这些对象。假设这是一个 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">]

我已经得到答案了。这是我为使上述问题有效所做的工作。

@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) }

这太完美了!

我们也可以这样做:

为数组添加一个新方法。 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>]

这也太丑了吧?

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