2011-09-09 6 views
1

私はマネージャであるユーザーの配列を持っています。オブジェクトを配列にグループ化する方法Ruby

ただし、繰り返しユーザーがあります。

アレイ内に各ユーザーのインスタンスが1つしかないようにグループ化したいと思います。

この問題を解決するにはどうすればよいでしょうか?

@managers.sort_by{|obj| obj.id} # Just sorted the data but did not eliminate duplicats 

@managers.group_by{|u|u.name} # just created a bunch of arrays for each name 
+0

私にこのような偉大な答えを与えてくださった皆様に感謝します。本当にNOOBがこのことを学ぶのを助けます。 – chell

答えて

6

uniqメソッドを使用すると、重複が削除された新しい配列が返されます。あなたが同じオブジェクトIDを意味複製することであれば、あなたは次の操作を行うことができます

@managers.uniq 
+2

または@ managers.uniq!既存の配列を変更します。 – sunkencity

+0

または@ managers.uniq_by {| manager | manager.user_id}(http://apidock.com/rails/Array/uniq_byを参照) –

+1

または(短い)'@managers.uniq_by&:user_id' – netmute

1

@managers.uniq.group_by(&:name) 
1

配列のフィルタリングは、症状固定のように感じています。最初に配列にゴミが含まれているのはなぜですか?

Userモデルにmanager?メソッドを追加して、ユーザーがマネージャーの場合はtrueを返すことをおすすめします。次に、

@managers = User.select &:manager? 

のようなものになり、マネージャーだけを含む配列が得られます。

+0

'manager?'メソッドが各ユーザに関連するレコードを見つけようとすると、N + 1クエリの問題に直面しません。 (マネージャージョブに適用するときにコールバックによってtrue/falseに設定された "manager"カラムを使用しない/終了する) –

+0

'manager'メソッドが' role'カラムを念頭に置いていました。一致する役割しかし、あなたはあなたのシナリオに合っています。私たちはここで与えられた文脈については十分に分かっていないと思う。 – netmute

+0

私の場合、それは同じ人が彼らが作成する多くのボードのマネージャになることができる方法です。ですから、時間がたつにつれて、同じマネージャーによって複数のボードが得られるでしょう。 – chell

1

あなたも

Manager.select('DISTINCT user_id') 

がより良いパフォーマンスwhith、最初の場所でクリーンな配列を得るために行うことができます。

関連する問題