aoのプログラミングブログ

あおさんのエンジニア学習日記

初心者のプログラミング学習軌跡。

Rails モデルの関連付け"has_many"とは

Rails モデルの関連付け"has_many"とは

has_many ってなに?

  • 他のモデルとの間に、「1対多」の繋がりがあることを示す。

※反対側のモデルにはbelongs_toが使われることが多い。

規則

  • has_many関連付けを宣言する場合、相手のモデル名は複数形にする。

ユーザーがそれぞれメッセージを投稿できるアプリがあるとする。 モデルクラスは、UserモデルとPostモデル。

  • Userモデルに
has_many :post
  • Postモデルに
belongs_to :user

と入れることで、1対多の関連付けができる。 つまり、

User : 多数のpostを持つ。

Post :1つの user_id を持つ。

ということです。

補足

ん?user_id? Userのインスタンスなら、user.id では? と思いますね。

外部キー(関連付けた相手のクラスのインスタンスを参照するキー)の場合は、user_id のように、アンダーバーを使用するとRailsが勝手に判断してくれます!

オプション

has_manyに追加できるオプション

:as
:autosave
:class_name
:counter_cache
:dependent
:foreign_key
:inverse_of
:primary_key
:source
:source_type
:through
:validate

まとめ

突然「1対多」という聞き慣れぬ言葉を聞くと構えてしまいますが、

UserとPostの例で考えれば簡単でした。

参考資料

Rails モデルの関連付けとは?

Rails モデルの関連付け

メッセージアプリを作る教材をやっていたら、突然出てきた「モデルの関連付け」。 使い方はわかったけれど、この「関連付け」って一体なに?何のためにするの?

疑問におもったのでお馴染みRailsガイドで調べてみました。

関連付け(association)

目的

モデル同士を関連付けることで、コードの共通操作を簡単にできるようにする。

例えば、ユーザーがそれぞれメッセージ投稿を行えるアプリケーションを作っているとして。

UserモデルとPostモデルがあったとする。

もし関連付けがされていないと、

  • Userが1つ投稿するときは、Post.createに毎回user.idを指定する文言を入れなければいけない。
@post = Post.create(user_id: @user.id)
  • Userを削除するときは、そのuser.idで登録されたメッセージを探し、メッセージを一つ一つ削除するコードを書いてから、user.destroyをしなければならない。
@posts = Post.where(user_id: @user.id)
@posts.each do |post|
  post.destroy
end
@user.destroy
  • 関連付けによってUserモデルとPostモデルが適切に結びつけられていれば、こうした記述をシンプルにすることができる。
class User < ApplicationRecord
  has_many :posts, dependend: :destroy
end

class Post < ApplicationRecord
  belongs_to :user
end
@post = @user.posts.create
@user.destroy

Railsのモデルの関連付けは6種類ある

  • belongs_to
  • has_one
  • has_many
  • has_many :through
  • has_one :through
  • has_and_belongs_to_many

関連付けはマクロのような呼び出しとして実装されている

  • モデルの関連付けを行うと、2つのモデルのそれぞれのインスタンスの間で、外部キーなどの情報を保持しておくように等の指示がRailsに伝わる。
  • 便利なメソッドもそのモデルに追加される。

「関連付け」はRailsの便利な機能だった

関連付けを書くだけで、Railsが勝手にモデル名を推測して、モデル間でコードの共通操作ができるようになる…。

すごいですね。

Railsソースコードにも記載があったので、今度読んでみようと思います。

参考資料

RailsのMVCとはなにか?

RailsMVCってなに?

先日、エンジニアの知人より、

RailsアーキテクチャMVCMVCアーキテクチャに則って、あるべき場所にあるべきコードがあるのが良いコード。

という話を聞きました。 基礎概念の理解の大切さが身に沁みたので、 改めて、MVCとは?アーキテクチャとは?をまとめてみようと思います。

まず、アーキテクチャってなに?

ソフトウェアやハードウェアの「基本的な設計概念」のことです。

MVCってなに?

  • MVCとは、UIを持つアプリケーションを実装するためのデザインパターンのことです。
  • アプリケーションが持つ内部データを、ユーザーが直接参照・編集する情報から分離しているのが特徴です。

M model

  • そのアプリケーションが扱う領域のデータと手続きを書く場所
  • データ、ビジネスルール、ロジック、関数など。

V view

  • UIへの出力を担当する場所。

C controller

  • 入力を受け取りmodelとviewへの命令に変換する

つまり、RailsMVCはそれぞれ何をしているの?

  • Model
    • データベースとのやり取りをする場所。モデルクラス(Active Record)とデータベース(テーブル)を作成する。
  • View
    • その名の通り、画面を表示するファイル。HTMLタグの合間にERBを含む形式で書かれる。
  • Controller
    • 司令頭。リクエストを受け取り、データをモデルから取得したりモデルに保存したりして、最後にビューを用いてHTML出力を生成する。

まとめ

以上、Railsアーキテクチャの説明でした。 それぞれのコードがあるべき場所にあること、意外と難しいです…。 Viewについif分岐を書いてしまうことがよくあります。 (本来きちんとヘルパーに切り出すべき) しっかり意識して良いコードを書いていきたいですね!

参考資料