はじめに
Rails最近頑張ってます。![]()
ここ知らなかったってところや自分的に知識がまだ浅いなと思う部分をQiitaにまとめていきたいと思います!
まだまだな部分が多いですが、すこしでも皆様の理解の助けになれたら、嬉しいです。
STIって?
単一テーブル継承といって、一つのテーブル(親にあたるもの)から継承して、新しいテーブル(子にあたるもの)を作りましょう!!みたいな考え方です。親のテーブルに含まれるカラムなども引き継がれるので、同じ部分を子クラスで定義しなくてよくなるので、手間も減るし、わかりやすくなるので、利点が多いですね!子クラスで、カラムを新たに追加することもできるので、割と簡単に拡張?もできます。
どんな時に、使うと便利??
似たような(ほぼ同じような機能を持つ)モデルがたくさんあるときに、1つ1つに対して、カラムの定義などを行わなくてよくなるので、モデルがたくさんあるときに、使うと、便利かもしれません。
構造的にどうなってるの?
こんな感じです。1つのクラスを継承して、子クラスを生成します。子クラスでは、親クラスで持っているもの+自クラスで定義したものを持つことができます。
作り方について
-
まず、親クラスの生成をします。
bundle exec rails g model Tweetを実行して、マイグレーションファイルの中に、クラスに持たせる要素などの値を書き込んで、
bundle exec rails db:migrateを実行します。 -
子クラスについては、モデルファイルのおいてあるフォルダに
モデル名.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
class TweetImage < Tweet
has_one :image, foreign_key: :tweet_id
accepts_nested_attributes_for :image, allow_destroy: true
end
※クラス名のあとの部分に気をつけましょう!!
親クラスはApplicationRecordになっていますが、子クラスの方は、モデルを継承して作るので、親クラスのモデル名を入れなければ、なりません。
さいごに
最後まで、読んでいただきありがとうございます。
まだまだ、説明下手ですが少しでもみなさんに伝わりやすい記事をかけるように、努力していきたいと思います!
