前提・実現したいこと
以下のようなテーブルがあると想定した場合の、モデルを記述したいです。
artist
は0個以上のsong
を持ちます。
song
のcomposer_id
、lyricist_id
は1人以上、arranger_id
は0人以上のartist
を持ちます。
この場合のモデルのhas_many
やbelongs_to
の記述の仕方が分かりません。
artist.rb
とsong.rb
に多対多の記述を追加したいと思っています。
該当のソースコード
該当のモデルです。
ruby
1# app/models/artist.rb 2 3class Artist < ApplicationRecord 4end
ruby
1# app/models/song.rb 2 3class Song < ApplicationRecord 4end
外部キーの指定の仕方があっているのかわかりませんが、マイグレーションは以下のようにしました。
ruby
1# db/migrate/20210927135753_create_songs.rb 2 3class CreateSongs < ActiveRecord::Migration[6.1] 4 def change 5 create_table :songs do |t| 6 t.string :song_name 7 t.references :lyricist 8 t.references :composer 9 t.references :arranger 10 11 t.timestamps 12 end 13 add_foreign_key :songs, :artists, column: :lyricist_id 14 add_foreign_key :songs, :artists, column: :composer_id 15 add_foreign_key :songs, :artists, column: :arranger_id 16 end 17end
マイグレート後のスキーマです。
ruby
1# db/schema.rb 2 3ActiveRecord::Schema.define(version: 2021_09_27_135753) do 4 5 # These are extensions that must be enabled in order to support this database 6 enable_extension "plpgsql" 7 8 create_table "artists", force: :cascade do |t| 9 t.string "artist_name", null: false 10 t.datetime "created_at", precision: 6, null: false 11 t.datetime "updated_at", precision: 6, null: false 12 end 13 14 create_table "songs", force: :cascade do |t| 15 t.string "song_name" 16 t.bigint "lyricist_id" 17 t.bigint "composer_id" 18 t.bigint "arranger_id" 19 t.datetime "created_at", precision: 6, null: false 20 t.datetime "updated_at", precision: 6, null: false 21 t.index ["arranger_id"], name: "index_songs_on_arranger_id" 22 t.index ["composer_id"], name: "index_songs_on_composer_id" 23 t.index ["lyricist_id"], name: "index_songs_on_lyricist_id" 24 end 25 26 add_foreign_key "songs", "artists", column: "arranger_id" 27 add_foreign_key "songs", "artists", column: "composer_id" 28 add_foreign_key "songs", "artists", column: "lyricist_id" 29end
試したこと
テーブルを作成後、マイグレーションでsong
に外部キーとしてartist
を指定するようにマイグレートしました。
Googleで検索したり、公式ドキュメントを見てみたのですが、多対多で同じテーブルを指定するものがなかなか出てきませんでした。
has_many
やbelongs_to
を使うとは思うのですが、いまいちコーディングの仕方が分かりません。
補足情報(FW/ツールのバージョンなど)
外部キーの指定の仕方がそもそもおかしいなどがありましたら、ご指摘のほどよろしくお願いします。
wsl
1rails: rake, version 13.0.6 2ruby: ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux] 3node: v14.17.1 4yarn: 1.22.11 5psql: psql (PostgreSQL) 13.4 (Ubuntu 13.4-1.pgdg20.04+1)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/27 23:18
2021/09/27 23:36
2021/09/28 01:25 編集
2021/09/28 01:26
2021/09/28 01:58