Невозможно задать значение "UnknownAttributeError", если столбец является одиночным, и "NoMethodError", если столбец имеет множественное число. - PullRequest
0 голосов
/ 01 августа 2020

Вопрос: Как мне заполнить мой 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

...