Railsで開発していて、冗長なコードがあったので( ..)φメモメモ
シチュエーション
例えば、UserモデルとExtraworkモデルがあり、1対多の関係で存在しているとする。
ローカル変数extraworksには、下記レコード(オブジェクト)が複数入っているとする。
ex) Extraworkモデル
id | 残業申請日 | user_id |
---|---|---|
1 | 2019.6.1 | 2 |
2 | 2019.6.2 | 2 |
3 | 2019.6.2 | 3 |
4 | 2019.6.4 | 3 |
… | … | … |
29 | 2019.6.15 | 2 |
30 | 2019.6.15 | 3 |
31 | 2019.6.16 | 4 |
冗長なコード
ローカル変数extraworksから、一意のUserオブジェクトを配列として取得したい場合、
以前まで下記のように書いていた。
※Rubyでfor文はあまり使用しないと思いますが、使ったことないので使ってみました。
users = []
for i in extraworks do
users << i.user
end
@extrawork_applying_users = users.uniq
# .userで紐付いているUserオブジェクトにアクセス
# .uniqでUserオブジェクトの重複を取り除き、一意にする
mapメソッドを使おう!
空の配列を定義するようなコードはたいていの場合、mapメソッドでシンプルにできる。
※mapメソッドの詳細については、ググればすぐに出てきますので、割愛します。
※&:も少し高度な書き方みたいですが、ググればすぐに出てきますので、割愛します。
@extrawork_applying_users = extraworks.map(&:user).uniq
最後に
プログラミング学習のためには、ググりながら何か作ってみることが
一番効果的な方法と思っていたので、技術書には手を付けていませんでした。
ただ最近は、技術書を読んでいるとこんなことができるのかと学び・気づきの点が
多々発見でき、良い勉強になっています。
今回は「プロを目指す人のためのRuby入門」を読んで気づきを得ました。