0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rails-Tutorial 13章 Micropostの作成とUserとの関連付けについて

Last updated at Posted at 2021-04-08

Qiita初投稿です。

Rails-Tutorial 13章について自身のアウトプットと自分のつまづいたところの共有もかねて投稿してみました。

Micropostの作成

$ rails generate model Micropost content:text user:references

$ rails generate modelはmodelとmigrationとtestを作成するコマンドでした。
そこにcontent:textを加えることによってText型のcontent属性を付与します。Text型は255文字までしか格納できないString型と違ってさらに長い文字列を扱えます。Text型は長い文字列を扱えるためパフォーマンスに影響するようですが今は考えなくても良いレベルの話かと思います。
スクリーンショット 2021-04-08 18.43.01.png
さらにuser:referencesによりuser_id属性が付与されユーザーと1対1の関係であることを表すbelongs_to :userがapp/models/micropost.rbに追加されます。

Micropostモデルのマイグレーションファイルでもt.timestampsという行 (マジックカラム) が自動的に生成されています。これによりcreated_atとupdated_atというカラムが追加されます。
よってmicropostsのデータモデルは以下のようになります。スクリーンショット 2021-04-08 18.53.25.png

UserとMicropostの関連付け

ここで一つのマイクロポストは一人のユーザーと関係性を持つべきであり、一人のユーザーは複数のマイクロポストとの関係性を持つべきです。
Twitterで例えると、一つのツイートのツイート主が複数人だったらおかしいですし、ツイート主が1つしかつぶやきができなかったらとんでもない欠陥を抱えているのは言うまでもないでしょう。
このことをそれぞれ
MicropostとそのUserは belongs_to (1対1) の関係性があるUserとそのMicropostは has_many (1対多) の関係性がある
と表現します。スクリーンショット 2021-04-08 19.06.44.png

この関連付けを行うことにより
スクリーンショット 2021-04-08 19.09.12.png
ではなく
スクリーンショット 2021-04-08 19.09.20.png
を利用してマイクロポストを作成できるようになります。
つまり親モデルに属する子モデルのインスタンスを作成したい場合はnewではなくbuildを用います。
なおbuildメソッドはnewメソッドと同様にオブジェクトを返しますがデータベースには反映されないメソッドです。
そのほかにもmicropost.userだったらマイクロポストに紐づいたユーザーオブジェクトを返します。なおマイクロポストとユーザーは1対1の関係なのでどちらも単数系を用います。
user.microposts.find_by(id: 1)ユーザーに紐づいてidが1のマイクロポストを検索しますが、こちらは1対多の関係なのでマイクロポストは複数形です。user.microposts.createやuser.microposts.buildも同様の理由です。

なお、belongs_toとhas_manyは以下のように記述します。

スクリーンショット 2021-04-08 19.27.44.png

dependent: :destroy

このようにマクロポストとユーザーを関連付けることができましたが、もしユーザが削除されても、ユーザーに関連するマイクロポストは自動では削除されません。
そのためにdependent: :destroyと言うオプションを用います。スクリーンショット 2021-04-08 19.32.52.png

こうすることでユーザーが削除されてもマイクロポストだけが残ってしまうと言う問題を解消できます。

最後に

ということでMicropostの作成とUserとの関連付けについてRails-Tutorialの受け売りですがまとめさせていただきました。
チュートリアルを自分で勉強していてわからなかったことやつまづいた点などを急に補足したりしたのでまとまっていない点などがあり少し見づらい点もあったかと思いますが参考になれば幸いです。
また間違っている点やミスリードを誘うような表現がございましたら教えていただきたいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?