LoginSignup
3
0

More than 3 years have passed since last update.

【Rails】1対多の作成

Last updated at Posted at 2020-11-25

本投稿の目的

・Rails学習の議事録です。


学習に使った教材

Udemyの以下2つの教材を参考にまとめました。
"はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう"
"フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座"


○1対多とは?

・紐づいたmodel間での関係の名称
・ex)ツイートmodelとコメントmodle
・この時,ツイート1つに対して複数コメントが可能
・この関係を"1対多"の関係と呼ぶ

【説明の簡略のために書き省略記号を使用】
・素となるmodel = model(1)
・紐づくmodel = model(多)
*(コーディング例では任意のmodel名が入る)

【1対多の関係におけるmodel関係の名称を2つ示す】
・has many = model(1)から見たmodel(多)の関係
・belongs to = model(多)からみたmodel(1)の関係

○model(他)作成後の操作

①model(多)の作成

qiita.rb
rails g model model() model(1):references column情報

【解説】
○model(1): references
⇨ referencesでmodel(1)を紐けるように設定
⇨ これで,model(多)には, model名(1)_id というcolumnが作成される

【例:Q&Aアプリケーションのmodelを想定】

qiita.rb
rails g model answer questin:references column情報 

【解説】
⇨ answer model へ question model を紐付ける
⇨ questionのcolumnに answer_id が作成される

②model(多)のmigrationファイルへの記述

・model(多)を紐づけで作成しておけば自動記述される

qiita.rb
class Create+model() < ActiveRecord::Migration[5.0]
  def change
    create_table :model()s do |t|
      t.references :model(1), foreign_key: true
      t.string :column1, null: false
      t.text :column2, null: false

      t.timestamps
    end
  end
end

【解説】
○null: faluse
⇨ column値に 空 を受け付けない

○t.reference :model(1), foreign_key: true
⇨ model(1)のid にないと,model(1)_idとしてmodel(多)で保存できない

③model(多)のdbの作成

rails db:migrate

④model(多)のmodelファイルへの記述(自動記述)

・model(多)作成時に,以下が,model(多)のmodelファイルへ自動で記述される

qiita.rb
class model() < ApplicationRecord
  belongs_to :model(1)
end

【解説】
○belongs_to :model(1)
⇨ (*model(1)名称は単数係)

【例:answer modelに紐づくquestion modelの場合】

qiita.rb
class Answer < ApplicationRecord
  belongs_to :question
end

○belongs_to :question⇨ 親がmodel(1) で 子がmodel(多)
⇨ (model(多)から見るとmodel(1)は1つに定まる)
⇨ (子供は複数人いるが,親や一位に定まるというイメージ)

⑤model(1)のmodelファイルへの記述(手動記述)

・model(1)については,追加で以下の記述を追加する

qiita.rb
    has_many :model()s, dependent: :destroy

【解説】
○has_many :model(多)s
⇨ 一番上の行に記述する
⇨ (*モデル名(多)は複数形)

○dependent: :destroy
⇨ model(1)が削除されると紐づいたmodel(多)は自動で消される という設定

【例:Answerの素となるQuesitionの場合】

qiita.rb
class Question < ApplicationRecord
    has_many :answers, dependent: :destroy
end

⑥rails routesの更新

・config/routes.rb ファイルを開く
・内容を次のように更新 (do 移行が追加で更新する部分)
*(model名は複数形)

qiita.rb
resources :model(1)s do
 resources :model()s
end
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