2016-06-01 7 views
1

ここにシナリオがありますが、これらのオブジェクトがあります。のは、これがUserであると仮定しよう:例えば私はUser.id == 2を移動する方法私は、一つのオブジェクトを上に移動することができ、ユーザーオブジェクトオブジェクトをレールに集めて移動する

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

@user = User.all 

オブジェクトから来ましたの?私が望む結果は以下の通りです。

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

結果を 'ActiveRecord Relation Object'に入れるか、' Array'に変換してもよろしいですか? –

+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 

その後だから我々は、配列のための方法swap!を使用することができるのconfig/environment.rbに

require 'rails_extensions' 

でこれを追加し、それ以前に1とオブジェクトを交換します。

@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

あなたの質問は、1つのオブジェクトを上に移動することですか?まあ、もっと柔軟にしたいのであれば、単に '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

関連する問題