前提
以下のような多対多のテーブルを有識者の方のアドバイスをもとに作成しました。
しかし、私の知識が浅く、コントローラの作り方が分からなくなってしまいました。
フレームワークは Rails 6 系、DBは PostgreSQL 13 系です。
モデルの状態
ruby
1# app/models/song.rb 2class Song < ApplicationRecord 3 has_many :composer_songs, dependent: :destroy 4 has_many :composer_song_artists, through: :composer_songs 5 6 has_many :lyricist_songs, dependent: :destroy 7 has_many :lyricist_song_artists, through: :lyricist_songs 8 9 has_many :arranger_songs, dependent: :destroy 10 has_many :arranger_song_artists, through: :arranger_songs 11end 12 13# app/models/artist.rb 14class Artist < ApplicationRecord 15 has_many :composer_songs, dependent: :destroy 16 has_many :composer_song_songs, through: :composer_songs 17 18 has_many :lyricist_songs, dependent: :destroy 19 has_many :lyricist_song_songs, through: :lyricist_songs 20 21 has_many :arranger_songs, dependent: :destroy 22 has_many :arranger_songs_song, through: :arranger_songs 23end 24 25# app/models/lyricist_song.rb 26class LyricistSong < ApplicationRecord 27 belongs_to :lyricist, class_name: "Artist", foreign_key: "artist_id" 28 belongs_to :song 29end 30 31# app/models/composer_song.rb 32class ComposerSong < ApplicationRecord 33 belongs_to :composer, class_name: "Artist", foreign_key: "artist_id" 34 belongs_to :song 35end 36 37# app/models/arranger_song.rb 38class ArrangerSong < ApplicationRecord 39 belongs_to :arranger, class_name: "Artist", foreign_key: "artist_id" 40 belongs_to :song 41end
スキーマの状態
ruby
1# db/schema.b 2 3ActiveRecord::Schema.define(version: 2021_09_29_115047) do 4 5 # These are extensions that must be enabled in order to support this database 6 enable_extension "plpgsql" 7 8 create_table "arranger_songs", force: :cascade do |t| 9 t.bigint "arranger_id" 10 t.bigint "song_id" 11 t.index ["arranger_id"], name: "index_arranger_songs_on_arranger_id" 12 t.index ["song_id"], name: "index_arranger_songs_on_song_id" 13 end 14 15 create_table "artists", force: :cascade do |t| 16 t.string "name" 17 t.datetime "created_at", precision: 6, null: false 18 t.datetime "updated_at", precision: 6, null: false 19 end 20 21 create_table "composer_songs", force: :cascade do |t| 22 t.bigint "composer_id" 23 t.bigint "song_id" 24 t.index ["composer_id"], name: "index_composer_songs_on_composer_id" 25 t.index ["song_id"], name: "index_composer_songs_on_song_id" 26 end 27 28 create_table "lyricist_songs", force: :cascade do |t| 29 t.bigint "lyricist_id" 30 t.bigint "song_id" 31 t.index ["lyricist_id"], name: "index_lyricist_songs_on_lyricist_id" 32 t.index ["song_id"], name: "index_lyricist_songs_on_song_id" 33 end 34 35 create_table "songs", force: :cascade do |t| 36 t.string "name" 37 t.datetime "created_at", precision: 6, null: false 38 t.datetime "updated_at", precision: 6, null: false 39 end 40 41 add_foreign_key "arranger_songs", "artists", column: "arranger_id" 42 add_foreign_key "arranger_songs", "songs" 43 add_foreign_key "composer_songs", "artists", column: "composer_id" 44 add_foreign_key "composer_songs", "songs" 45 add_foreign_key "lyricist_songs", "artists", column: "lyricist_id" 46 add_foreign_key "lyricist_songs", "songs" 47end
試したこと
以下のような操作はちゃんとできました。
ruby
1Song.create(name: "test1") 2Song.create(name: "test2") 3Artist.create(name: "a1") 4Artist.create(name: "a2")
中間テーブルを多分ちゃんと覗けています。。。
今はまだ中間テーブルは空です。
ruby
1irb(main):012:0> Song.first.composer_songs 2 Song Load (0.6ms) SELECT "songs".* FROM "songs" ORDER BY "songs"."id" ASC LIMIT $1 [["LIMIT", 1]] 3 ComposerSong Load (0.7ms) SELECT "composer_songs".* FROM "composer_songs" WHERE "composer_songs"."song_id" = $1 [["song_id", 1]] 4=> []
実現したいこと
以下のような状態を実現できるコントローラーを記述したいです。
しかし、どのようにしてSong.create(name: "test1")
のような
create
やupdate
の処理を記述したらいいのかわかりません。
私のような多対多のテーブルにおける、コントローラ(CRUD)の記述の仕方を教えていただきたいです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー