Вопрос: Как мне заполнить мой postgres db через ActiveRecord, когда я использую отношения "многие ко многим" с таблицами соединения?
Я создаю свои базы данных, и я сделал это в отдельной ветке, потому что в прошлый раз я испортил их где-то вдоль линии, и мне пришлось начинать свой проект заново. У меня есть исполнители, релизы, лейблы и теги.
У релизов есть многие-ко-многим с тегами. У меня есть
- добавлено
t.belongs_to [tag/release]
к каждой миграции create_table
create_release_table :
class CreateReleases < ActiveRecord::Migration[5.2]
def change
create_table :releases do |t|
t.string :release_type, null: false
t.string :embed_url
t.text :title, null: false
t.integer :original_release_year
t.belongs_to :artist, null: false
t.belongs_to :label
t.belongs_to :tag, null: false
t.timestamps
end
end
end
create_tags_table :
class CreateTags < ActiveRecord::Migration[5.2]
def change
create_table :tags do |t|
t.string :tag, null: false
t.belongs_to :release
t.timestamps
end
end
end
- сделал миграцию таблицы соединений
class CreateReleasesTags < ActiveRecord::Migration[5.2]
def change
create_table :releases_tags, :id => false do |t|
t.belongs_to :release
t.belongs_to :tag
end
end
end
- добавил
has_and_belongs_to_many :[tags/ releases]
к моим моделям тегов и релизов
belongs_to :artist
has_and_belongs_to_many :labels
has_and_belongs_to_many :tags
end
- запустил
bundle exec rake db:migrate && bundle exec rake db:rollback && bundle exec rake db:migrate
который завершился без ошибок
I go запустить bundle exec db:seed
, хотя и я получаю сообщение об ошибке относительно тегов (и то же самое происходит с лейблом, но не с исполнителем).
- Когда я помещаю
tag: tag1
, он говорит ActiveModel::UnknownAttributeError: unknown attribute 'tag' for Release
- Когда я меняю его на
tags: tag1
, я получаю NoMethodError: undefined method
каждый 'для #Tag: 0x00007f90f7ee1940`
мой исходный файл:
artist1 = Artist.create(name: "Manilla Road", description: "Heavy metal band from a country that looks like a country", alias: ["Manilla Road", "Other Name"])
tag1 = Tag.create(tag: "heavy-metal")
label1 = Label.create(name: "Polyvinyl", description: "A Label with of Montreal on it")
release1 = Release.create(release_type: "EP", title: "A Cool Tune", description: "Wow. I love this record. So Cool! Here is its history!", artist: artist1, original_release_year: 1997, tag: tag1, label: label1)
моя полная схема:
ActiveRecord::Schema.define(version: 2020_08_01_134359) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
create_table "artists", force: :cascade do |t|
t.string "name", null: false
t.text "description"
t.text "alias", default: [], array: true
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "artists_releases", id: false, force: :cascade do |t|
t.bigint "artist_id"
t.bigint "release_id"
t.index ["artist_id"], name: "index_artists_releases_on_artist_id"
t.index ["release_id"], name: "index_artists_releases_on_release_id"
end
create_table "labels", force: :cascade do |t|
t.string "name", null: false
t.text "description"
t.bigint "release_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["release_id"], name: "index_labels_on_release_id"
end
create_table "labels_releases", id: false, force: :cascade do |t|
t.bigint "label_id"
t.bigint "release_id"
t.index ["label_id"], name: "index_labels_releases_on_label_id"
t.index ["release_id"], name: "index_labels_releases_on_release_id"
end
create_table "releases", force: :cascade do |t|
t.string "release_type", null: false
t.string "embed_url"
t.text "title", null: false
t.integer "original_release_year"
t.bigint "artist_id", null: false
t.bigint "label_id"
t.bigint "tag_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.text "description"
t.index ["artist_id"], name: "index_releases_on_artist_id"
t.index ["label_id"], name: "index_releases_on_label_id"
t.index ["tag_id"], name: "index_releases_on_tag_id"
end
create_table "releases_tags", id: false, force: :cascade do |t|
t.bigint "release_id"
t.bigint "tag_id"
t.index ["release_id"], name: "index_releases_tags_on_release_id"
t.index ["tag_id"], name: "index_releases_tags_on_tag_id"
end
create_table "tags", force: :cascade do |t|
t.string "tag"
t.bigint "release_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["release_id"], name: "index_tags_on_release_id"
end
end