【Railsチュートリアル】慣習的に正しいコードの書き方
目的
Railsチュートリアルで「このコードは慣習的に正しくない」という記述があるが、なぜなのかを説明する。
背景
Railsを仕事で書いていく上で、モデル同士の関連の定義とその使い方をわりと意識しているのだが、いつどこで勉強したのか怪しかった。
出典を明らかにしたかった。
該当の内容
https://railstutorial.jp/chapters/user_microposts?version=5.0#code-micropost_validity_test
前提として、以下のような、関連を持つモデルUser
とMicropost
があるとする。(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
の場合はUser
のmicroposts
という関連(インタフェース)に依存させられる。
まとめ
いろいろ理由をつけてみましたが、やはり一番は「慣習的に」なのでしょう。
業務でRailsを書いていると、先人の書いたコードに引っ張られついついこのあたりの「自然な書き方」を忘れがち。
誰に見せても恥ずかしくないようなRailsのコードを書けるよう、日々心がけたいものです。
その他
この辺はRubyMine使うと指摘してくれるのかな?