1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

permutationメソッドを使って初期設定ユーザー達を全員相互フォロー関係にする

Last updated at Posted at 2020-07-06

はじめに

初めてqiitaに投稿します初学者と申します。
文言に誤り等がありましたらご指摘いただけますと幸いです。

作成中の転職活動用ポートフォリオにて、初期データのユーザー達をseeds.rbで相互フォロー関係にさせておりました。
とある企業のエンジニア様からwantedlyにてコードレビューを含んだ返信をいただき、
このseeds.rbに関して「ロジックが異常に分かりにくい」と指摘を受けました。

修正前のseeds.rb

下記のコードで初期設定ユーザー達を相互フォロー関係にさせておりました。

db/seeds_relationships.rb
19.times do |n| # 19回処理を繰り返す
  users = User.all # 変数usersに全てのUserオブジェクトを代入
  user = users.find(n + 1) # 変数usersから指定したid(n+1)のUserオブジェクトを変数userに代入
  following = users[0..18] # 変数followingに配列usersの1~19番目までのUserオブジェクトを代入
  following.shift(n + 1) # shiftメソッドで配列followingの先頭から(n+1)つの要素を取り除く
  followers = users[0..18] # 変数followersに配列usersの1~19番目までのUserオブジェクトを代入
  followers.shift(n + 1) # shiftメソッドで配列followersの先頭から(n+1)つの要素を取り除く
  following.each { |followed| user.follow(followed) } # userが配列followingに含まれる各ユーザー(followed)をフォローする
  followers.each { |follower| follower.follow(user) } # 配列followersに含まれる各ユーザー(follower)がuserをフォローする
end

一目でわかると思いますが・・・異常な分かりづらさです。

Array#permutationを使いなさい

そのエンジニア様からは上記のように指摘を受け、
permutationとは何だろう?と思い、翻訳してみると「順列」という意味であることが分かりました。

順列とは

異なるn個の中から異なるr個を取り出して1列に並べる数のことです。
【高校数学】1から分かる順列と組み合わせの違い

AB,BA,BC,CB,AC,CAみたいなヤツのことですね()。

順列を作成する

[1, 2, 3].permutation do |x|
  p x
end

配列の中の要素から下記のような順列が作成されます。

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]

permutationの後ろに(n)とすることで、配列の中から異なるn個の要素を取り出して並べることができます。

[1, 2, 3].permutation(2) do |x|
  p x
end
[1, 2]
[1, 3]
[2, 1]
[2, 3]
[3, 1]
[3, 2]

引用元:順列 (permutation) を作成する

修正後のseeds.rb

db/seeds_relationships.rb
users = User.all.to_a
users.permutation(2) do |n|
  n[0].follow(n[1])
end

1番目のユーザーが2,3,4,5…番目のユーザーをフォロー、
2番目のユーザーが1,3,4,5…番目のユーザーをフォロー、
3番目のユーザーが1,2,4,5…番目のユーザーをフォロー、となり、
permutationメソッドを使って初期設定ユーザー達を全員相互フォロー関係にすることができました。

【追記】もっと見やすくseeds.rb

db/seeds_relationships.rb
users = User.all.to_a
users.permutation(2) do |user1, user2|
  user1.follow(user2)
end

コメントをいただき修正しました。
可読性がかなり良いですね!

環境

  • Ruby 2.6.5
  • Rails 5.2.4.3
1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?