プログラミング

railsのincludesメソッドで関連しているデータを取得する

こんにちは、まくロロです。申請していたアドセンスがついに通りました!引き続き、プログラミンとブログを頑張って続けて行きたいと思います。

includesメソッドとは

railsのincludesメソッドは複数のアソシエートしているテーブルの値を取得することができます。例えばこのようなことがしたい時です。

ECサイトにおいて、ユーザーとそのユーザーの商品受け取り情報は1対1の関係でアソシエートしていなければいけませんね。

ここでいう商品受け取り情報とは、何日の何時にどのような支払い方法で「クレジット」か「代金引き換え」かどうかなどの情報だよ

1対1でなければ商品を購入した人に、いつ、どんな支払い方法で届けれなければならないかどうかなどがわからなくなってしまいますよね。。

具体的な流れとしては例えば、

  • hogeというユーザがECサイトで商品を購入する
  • hogeがformで配達日時と支払い方法を記入する
  • 最終確認画面で購入する商品と先ほど入力した情報をveiwで出力
  • このような流れの処理でユーザとそのユーザに付随している、配達情報など(購入手続き情報)を結びつける必要があります。

    そんな時にrailsではincludesメソッドを使用することで、正しい情報を取得するということです。

    では、実際今の例えをコードで見ていきましょう。

    ユーザに付随する購入手続き情報を取得しよう

    やりたいこととしてはhogeの購入手続き情報を最終確認画面でviewに表示することです。

    まず、結論のコードから載せます。

    info = Procedure.includes(:user)
    @info = info.find_by(user_id: current_user.id)

    前提条件として

  • Procedureモデルにユーザの購入手続き情報が格納
  • procedureテーブルにはuser_idカラムが存在
  • Userモデルでhas_one、Procedureモデルでbelongs_toのアソシエートを設定
  • sessions_helperでcurrent_userを定義
  • 上記の前提条件を設定した上で先ほどのincludesメソッドとfind_byメソッドでユーザーに付随している購入手続き情報を取得することができます。

    やっていることとしてはまず変数infoにuserテーブルと紐づいているproceduresテーブルの値を代入してます。

    そのあとfind_byでuser_idが現在ログインしているユーザのidと一致しているものを抜き出すことによって、現在のユーザと紐づいているprocedureオブジェクトを取得しています。

    なので例えば、proceduresカラムに以下のようなカラムを作ると

    iddaytimepayuser_id
    12019-3-1910:00~17:00クレジット20
    22019-3-2015:00~19:00代金引換30

    hogeがのuser.idが20だった場合、proceduresテーブルのuser_id:20のrow、すなわち、id:1のrowの情報がオブジェクトとして取得できます。

    ECサイトの最終確認画面でこれらの情報をviewで表示したければ、

    <%= @info.day %> # 2019-3-19
    <%= @info.time %> # 10:00~17:00
    <%= @info.pay %> # クレジット

    こんな感じで出力することができます。

    まとめ

    今回はアソシエートしているテーブルの情報を取得することができるincludesメソッドを紹介しました。

    railsのメソッドは便利なものがたくさんあるのでこれからも便利だなーと思うものを紹介したいと思います。

    railsでのカラム操作前のページ

    Dockerとは次のページ

    関連記事

    1. プログラミング

      【おすすめ】具体的なGolang勉強手順

      こんにちはマクロロです。前回は、RailsからGoを勉強する際の困難…

    2. プログラミング

      Goの基本文法を覚えよう

      今後は、少しづつ技術系記事を増やして行こと思っています。変数…

    3. プログラミング

      Dockerとは

      こんにちは、まくロロです。最近インフラ周りに興味が出てきて、今後do…

    4. プログラミング

      【エンジニア】サービス開発とアルゴリズムは別物?

      こんにちはまくロロです。今回は「サービス開発とアルゴリズムは別物であ…

    5. プログラミング

      jQueryの基本を学ぼう

      こんにちは、まくロロです。アニメーションを実装する際によく使…

    6. プログラミング

      dockerを使ってGolangの環境構築

      こんにちは、まくロロです。最近はサーバーをGo、フロントにR…

    コメント

    1. この記事へのコメントはありません。

    1. この記事へのトラックバックはありません。

    最近の記事

    PAGE TOP