Terminalでのコマンド例
1:rails g model model_name
2:rails db:migrate
1のコマンドでモデルファイルmodel_name.rb
とマイグレーションファイルcreate_model_names.rb
の二つが作成される。マイグレーションファイルにdbの構造を書き込んで、モデルファイルにバリデーションを書き込む。
マイグレーションファイル
class CreateEvents < ActiveRecord::Migration[7.0]
def change
create_table :events do |t|
t.references :users, null: false, foreign_key: true
t.string :name, null: false
t.timestamps
t.index :name
end
end
end
制約
マイグレーションファイルでは各カラムに制約をつけることができる。
制約の種類はggks。
外部キー
カラムの値が他のテーブルのidと紐づいている場合、t.references
を使用してカラムを作成する。ここではforeign_key: true
を忘れないように。ここで作成されるカラム名は自動的にテーブル名_id
という形になる。別の名前にすることもできる。
複合ユニーク
多対多の中間テーブルとかに使うことが多そう。このidは一回しか投稿できないとかの時はuser_idとpost_idを複合ユニークで紐づければ多重投稿の対策になる。
既にindexがついているカラムに複合ユニークをつけるときはひと手間必要。
class ChangeColumnSettingsFromAnswers < ActiveRecord::Migration[7.0]
def change
remove_index :answers, column: [:event_id, :user_id]
add_index :answers, [:event_id, :user_id], unique: true
end
end
モデルファイル
モデルファイルではバリデーションとか関連付けとかを書き込む。
バリデーション別記事作った気がする。
has_manyとbelong_to
各モデルファイルに書き込む。
今回はツイッターのようなひとりのユーザーが複数のツイート(post)を持っているという想定で話を進める。
has_many
class User < ApplicationRecord
has_many :posts, dependent: :restrict_with_error
多く持ってる方、複数のレコード(子レコード)に紐づく一つレコード(親レコード)を保存するモデルの方に書き込む。
dependentオプションをしてすることで親レコードが消えた際に子レコードをどう扱うかなどを決めることができる。
親レコードが論理削除の場合はrestrict_with_error
が良さそうだなと感じた。
belong_to
class Post < ApplicationRecord
belongs_to :user
end
子レコードの方に書き込む。
オプションは今回使わなかったのでわからないがあるらしい。
気づき・気になったこと
- 使ってみるとさほど難しくない。
- マイグレーションの
t.references
とかとセットで使うから関連づけて覚えた方がいい()
参考