Ассоциации баз данных, вызывающие проблемы при миграции БД с помощью postgres

#sql #ruby-on-rails #postgresql

Вопрос:

Я создавал базовую схему для приложения rails , но когда я пытаюсь перенести ее с помощью rails db:migrate , это приводит к некоторым странным ошибкам ассоциации, которые я не уверен, что является причиной.

 == 20211001092658 CreateDevelopers: migrating =================================
-- create_table(:developers)
   -> 0.0076s
== 20211001092658 CreateDevelopers: migrated (0.0077s) ========================

== 20211001093122 CreateMessages: migrating ===================================
-- create_table(:messages)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedTable: ERROR:  relation "teams" does not exist
/home/nero/Projects/SMS-Rails/db/migrate/20211001093122_create_messages.rb:3:in `change'

Caused by:
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "teams" does not exist
/home/nero/Projects/SMS-Rails/db/migrate/20211001093122_create_messages.rb:3:in `change'

Caused by:
PG::UndefinedTable: ERROR:  relation "teams" does not exist
/home/nero/Projects/SMS-Rails/db/migrate/20211001093122_create_messages.rb:3:in `change'
Tasks: TOP => db:migrate
 

У меня было несколько проблем с настройкой Postgres на моей машине, но я решил, что большая часть из них будет решена после того, как я создам роль, пароль и базу данных.

Файлы миграции:

 #developers

class CreateDevelopers < ActiveRecord::Migration[6.1]
  def change
    create_table :developers do |t|
      t.string :full_name
      t.string :email
      t.string :mobile

      t.timestamps
    end
  end
end

#teams

class CreateTeams < ActiveRecord::Migration[6.1]
  def change
    create_table :teams do |t|
      t.string :name
      t.string :dept_name
      t.string :dev_ids, array: true, default: []

      t.timestamps
    end
  end
end

#messages

class CreateMessages < ActiveRecord::Migration[6.1]
  def change
    create_table :messages do |t|
      t.references :team, null: false, foreign_key: true
      t.string :title
      t.text :content

      t.timestamps
    end
  end
end
 

Комментарии:

1. Я переименовал файлы, как 1_create_teams и так далее, и попытался выполнить миграцию, но переносится только developer модель. Файл схемы создается, но два других отсутствуют. Я пытаюсь откатиться, но это просто говорит мне, что модель уже существует.

2. Если у вас нет никаких ценных данных в базе данных, вы можете просто заново создать базу данных. Вызов rails db:drop amp;amp; rails db:create amp;amp; rails db:migrate .

3. Ладно, должно быть, я иду по этому неправильному пути. Это сбросило столы, но я получаю PG::InsufficientPrivilege: ERROR: permission denied to create database ответ . Я неправильно настраиваю роли в postgres или я должен быть в режиме psql или что-то в этом роде?

4. Я понял! По-видимому, по какой-то причине пришлось изменить роль пользователя, чтобы ему было разрешено создавать базы данных. Возможно, после этого потребуется освежить знания о postgres. Большое вам всем спасибо за помощь!

5. Подсказка — не допускайте ошибок при использовании t.string :dev_ids, array: true, default: [] . Вместо этого создайте реальную таблицу объединения ( rails g model membership team:references developer:references ), чтобы вы могли использовать ассоциации и ограничения внешнего ключа для поддержания ссылочной целостности, а также могли писать разумные запросы на объединение. Столбцы массива в основном являются просто современным эквивалентом хранения данных в строках, разделенных запятыми, и являются таким же нарушением 1-NF.