はじめに
こんにちは、TECH DRIVEのTedです。
今回はRuby、Ruby on Railsを学習されている初学者へ向けた、初学者から1歩レベルアップするためのコードの書き方をご紹介します。開発現場でよく使われる書き方の1つでもあるのでぜひ習得してみてください!
本題
親子関係のテーブルで親テーブルに紐づいた子テーブルのインスタンスを作るときに親のテーブルのidを簡単に持たせることができます。結果的にコントローラーやモデルに書く処理を少なくすることができます。
例えばユーザーの情報を持つusers
テーブルとユーザーの投稿の内容を持つposts
テーブルがあったとします。下記のような感じ
class User < ApplicationRecord has_many :posts end class Post < ApplicationRecord belongs_to :user end
users
はposts
の親になります。そして、サービスの中でユーザーが入力した内容をposts
テーブルのデータとして保存する処理があるとします。
ツイッターをイメージすればわかりやすいと思います。ユーザー(users
)とツイート(posts
)のような関係です。
ここで子テーブルと親テーブルを紐づけるときにいくつか方法がありますが普通に書くと下記のようになると思います。
class PostsController < ApplicationController before_action :set_user # 他のアクション def new @post = Post.new end def create @post = Post.new(post_params) @post.user_id = @user.id if @post.save # 保存が成功した時の処理 else # 失敗したときの処理 end end private def set_user @user = User.find(params[:user_id]) end def post_params params.require(:post).permit(:title, :body) end end
上記は特に問題はないのですが、さらに下記のように書くこともできます。
class PostsController < ApplicationController before_action :set_user # 他のアクション def new # ここがポイント!↓ @post = @user.posts.new end def create # ここがポイント!↓ @post = @user.posts.new(post_params) if @post.save # 保存が成功した時の処理 else # 失敗したときの処理 end end private def set_user @user = User.find(params[:user_id]) end def post_params params.require(:post).permit(:title, :body) end end
2つのコードの違いはnew
とcreate
アクション の中にあります。
Post
モデルのインスタンスをnew
するときに親であるUser
モデルに紐づけてnew
しているかどうかです。
こうすることで新しく作られたPost
モデルのインスタンスは親であるUser
モデルのid
、つまりuser_id
を最初から持っている状態になります。
逆にPost.new
で作るとuser_id
はあとでセットしなくてはなりません。
# これが @post = Post.new(post_params) @post.user_id = @user.id # こうなる @post = @user.posts.new(post_params)
これで少ないコードで実装できて投稿される内容はユーザーに紐づいていることがすぐにわかりそうです。
おしまいに
今回はコントローラーに処理を書いてご紹介しましたが、親子関係の子にあたるモデルのインスタンスを作るときは他の場所でも同じことができます。(例:モデルのメソッド内とか)
こういったコードが書けるだけで他の初学者と1歩差をつけることができますし、現場のエンジニアが見ても「こいつ、わかってるな」とアピールすることができます。
私もよく自作のサービスで前者のようなコードをよく書いていました。 しかし、同じ動作が期待できるコードでも書き方によってあとで見る人やあとで自分で見たときに「これは何か意味があるのだろうか?」と迷ってしまうこともあります。
ご自分でサービスやコードを書かれている方は、本記事の内容を踏まえてもう1度自分のコードを眺めて見るのも良いかもしれません。
このような細かい配慮の積み重ねが読みやすいコードに繋がります!
PR
TECH DRIVE協賛企業のサークルアラウンド株式会社では、プログラマーの成長を加速させるためのトレーニングを行なっています。フロントエンド/バックエンド問わず各種バリエーションがございますので、ご興味がある方は是非以下のリンクより詳細をご覧ください。
Ruby Climbing
週1からはじめられる「Ruby」でWEB開発の基礎が習得できる塾です。現役のプログラミング講師&Rubyエンジニアがプログラミング入門からフレームワーク(Sinatra/Ruby on Rails)を使用した本格的なWEB開発の学習までをしっかりとサポートします。
個別トレーニング
短期間でぐっと成長したい方は弊社主催の個別トレーニングがおすすめです。 トレーニング内容は、受講者の方の課題/要望をお伺いした上で、フルオーダメイドで作成させていただきます。 詳細は以下のリンクよりご確認ください。(応募者多数の場合には時間を別途ご用意する予定です)。