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 1 year has passed since last update.

railsでデータベースを作るときのメモ(マイグレーション、モデルファイル)

Last updated at Posted at 2022-11-09

Terminalでのコマンド例

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

user.rb
class User < ApplicationRecord
  has_many :posts, dependent: :restrict_with_error

多く持ってる方、複数のレコード(子レコード)に紐づく一つレコード(親レコード)を保存するモデルの方に書き込む。
dependentオプションをしてすることで親レコードが消えた際に子レコードをどう扱うかなどを決めることができる。
親レコードが論理削除の場合はrestrict_with_errorが良さそうだなと感じた。

belong_to

post.rb
class Post < ApplicationRecord
  belongs_to :user
end

子レコードの方に書き込む。
オプションは今回使わなかったのでわからないがあるらしい。

気づき・気になったこと

  • 使ってみるとさほど難しくない。
  • マイグレーションのt.referencesとかとセットで使うから関連づけて覚えた方がいい()

参考

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?