blog.waterlow.work

Ruby, Rails, js, etc...

【Railsチュートリアル】慣習的に正しいコードの書き方

目的

Railsチュートリアルで「このコードは慣習的に正しくない」という記述があるが、なぜなのかを説明する。

背景

Railsを仕事で書いていく上で、モデル同士の関連の定義とその使い方をわりと意識しているのだが、いつどこで勉強したのか怪しかった。
出典を明らかにしたかった。

該当の内容

Railsチュートリアルの一説。

https://railstutorial.jp/chapters/user_microposts?version=5.0#code-micropost_validity_test

前提として、以下のような、関連を持つモデルUserMicropostがあるとする。(DBのカラム等は自然に定義されているものとする)

# app/models/user.rb
class User
  has_many :microposts
end

# app/models/micropost.rb
class Micropost < ActiveRecord::Base
  belongs_to :user
end

このときuserに紐づくmicropostを作りたいときは、まず思いつく方法としては以下のようなもの。

user = User.first
Micropost.new(content: "test", user_id: user.id)

しかしこのやりかたは、このコードは慣習的に正しくないRailsチュートリアルで言及されている。
実際は以下のようにする。

user = User.first
user.microposts.build(content: "test")

習慣的に良いコードは何がいいのか

関連が明確になる

まずuser.micropostsというコードはUserからMicropostへの関連を定義していないと動かない。user.micropostsというコード を見るだけで関連が定義されていることが明確になる。

引数を減らせる

user_idを渡さなくて良い

主語をuserにすることができる

最初のレシーバがuserになるため、「ユーザがマイクロポストを作る」という見方ができる

依存が少なくなる

Micropost.newする場合はMicropostというクラス、user_idという属性に依存しているが、user.micropostsの場合はUsermicropostsという関連(インタフェース)に依存させられる。

まとめ

いろいろ理由をつけてみましたが、やはり一番は「慣習的に」なのでしょう。
業務でRailsを書いていると、先人の書いたコードに引っ張られついついこのあたりの「自然な書き方」を忘れがち。
誰に見せても恥ずかしくないようなRailsのコードを書けるよう、日々心がけたいものです。

その他

この辺はRubyMine使うと指摘してくれるのかな?