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

时间:2016-06-01 00:48:21

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

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

3 个答案:

答案 0 :(得分: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 :(得分:-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>]

答案 2 :(得分:-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}]