はじめに
初めてqiitaに投稿します初学者と申します。
文言に誤り等がありましたらご指摘いただけますと幸いです。
作成中の転職活動用ポートフォリオにて、初期データのユーザー達をseeds.rbで相互フォロー関係にさせておりました。
とある企業のエンジニア様からwantedlyにてコードレビューを含んだ返信をいただき、
このseeds.rbに関して「ロジックが異常に分かりにくい」と指摘を受けました。
修正前のseeds.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]
修正後のseeds.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
users = User.all.to_a
users.permutation(2) do |user1, user2|
user1.follow(user2)
end
コメントをいただき修正しました。
可読性がかなり良いですね!
環境
- Ruby 2.6.5
- Rails 5.2.4.3