#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.