3
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 5 years have passed since last update.

STIについて、少し理解できた人が記事を書いてみた

Last updated at Posted at 2020-05-21

はじめに

Rails最近頑張ってます。:clap:
ここ知らなかったってところや自分的に知識がまだ浅いなと思う部分をQiitaにまとめていきたいと思います!
まだまだな部分が多いですが、すこしでも皆様の理解の助けになれたら、嬉しいです。

STIって?

単一テーブル継承といって、一つのテーブル(親にあたるもの)から継承して、新しいテーブル(子にあたるもの)を作りましょう!!みたいな考え方です。親のテーブルに含まれるカラムなども引き継がれるので、同じ部分を子クラスで定義しなくてよくなるので、手間も減るし、わかりやすくなるので、利点が多いですね!子クラスで、カラムを新たに追加することもできるので、割と簡単に拡張?もできます。

どんな時に、使うと便利??

似たような(ほぼ同じような機能を持つ)モデルがたくさんあるときに、1つ1つに対して、カラムの定義などを行わなくてよくなるので、モデルがたくさんあるときに、使うと、便利かもしれません。

構造的にどうなってるの?

image.png

こんな感じです。1つのクラスを継承して、子クラスを生成します。子クラスでは、親クラスで持っているもの+自クラスで定義したものを持つことができます。

作り方について

  1. まず、親クラスの生成をします。
    bundle exec rails g model Tweetを実行して、マイグレーションファイルの中に、クラスに持たせる要素などの値を書き込んで、
    bundle exec rails db:migrateを実行します。

  2. 子クラスについては、モデルファイルのおいてあるフォルダにモデル名.rbで新しくファイルを新規作成して、親を継承するように設定します。

親クラス.rb
class Tweet < ApplicationRecord
  validates :content, length: { maximum: 140 }
  belongs_to :user
  has_many :retweets
  belongs_to :reply, foreign_key: :reply_id, class_name: 'Tweet' ,optional: true
  has_many :replies, foreign_key: :reply_id, class_name: 'Tweet'
  has_many :likes
end

子クラス.rb
class TweetImage < Tweet
  has_one :image, foreign_key: :tweet_id
  accepts_nested_attributes_for :image, allow_destroy: true
end

※クラス名のあとの部分に気をつけましょう!!
親クラスはApplicationRecordになっていますが、子クラスの方は、モデルを継承して作るので、親クラスのモデル名を入れなければ、なりません。

さいごに

最後まで、読んでいただきありがとうございます。
まだまだ、説明下手ですが少しでもみなさんに伝わりやすい記事をかけるように、努力していきたいと思います!

3
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
3
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?