移动轨道中的对象集合中的一个对象
这里是场景,我有这些对象。让我们假设这是一个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) }
这使得完美!
我们也可以这样做:
给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个。如果我有更多的100个呢?你的意思是我修改交换!方法?我在下面的答案就够了。 – HashRocket
你的问题是关于移动一个对象?那么如果你想要更多的灵活性,为什么不只是把arg'b = a - 1'改成'b',所以我们可以交换到我们想要的任何索引? – pyfl88
这是不是太难看了?
hash = [{ id: 1}, {id: 2}, {id: 3}]
hash.unshift(hash.delete(hash.select {|h| h[:id] == 2 }.first))
=> [{:id=>2}, {:id=>1}, {:id=>3}]
不对一个id进行排序,它是对象集合中的整个User对象。 – HashRocket
你想在'ActiveRecord关系对象'或将其转换为'数组'是好吗? –
我已经解决了这个问题。我在下面发布了我的答案。 – HashRocket