Я пытаюсь добавить новую таблицу в свой проект Rails с несколькими ссылками на другие таблицы. Однако внешние таблицы не имеют столбцов :id
; Я настроил их так, чтобы у каждого из них был столбец строки :code
вместо их первичных ключей.
Вот пример одной таблицы, на которую я буду ссылаться:
class CreateReasons < ActiveRecord::Migration[5.2]
def up
create_table :reasons, id: false do |t|
t.string :code
t.string :description
t.timestamps
end
execute "ALTER TABLE reasons ADD PRIMARY KEY (code);"
end
def down
drop_table :reasons
end
end
Полученное описание Postgres именно то, что я хочу:
development-# \d reasons
Table "public.reasons"
Column | Type | Collation | Nullable | Default
-------------+-----------------------------+-----------+----------+---------
code | character varying | | not null |
description | character varying | | |
created_at | timestamp without time zone | | not null |
updated_at | timestamp without time zone | | not null |
Indexes:
"reasons_pkey" PRIMARY KEY, btree (code)
Я хочу, чтобы моя новая таблица, назовем ее TestModel
, имела столбец с именем :reason_code
, который является ссылкой внешнего ключа на первичный ключ таблицы reasons
.
Что я пробовал:
add_reference :test_models, :reasons, column: :code, type: :string, name: :reason_code, foreign_key: true
под созданием таблицы. ОшибкаPG::UndefinedColumn: ERROR: column "id" referenced in foreign key constraint does not exist
add_foreign_key :test_models, :reasons, column: :code, type: :string, name: :reason_code
под созданием таблицы. ОшибкаPG::UndefinedColumn: ERROR: column "code" referenced in foreign key constraint does not exist
Внутри создания таблицы:
t.references :reason_code, foreign_key: { to_table: :reasons }
иt.references :reason_code, foreign_key: { to_table: :reasons, column: :code }
оба дают мне ошибкуPG::UndefinedColumn: ERROR: column "id" referenced in foreign key constraint does not exist
И несколько других перестановок этих функций. Есть ли способ сделать это в Rails, желательно без выполнения большего количества необработанного SQL?
create_table
:t.string :reason_code
2. добавление строки из @edariedl ниже создания таблицы. 19.08.2019foreign_key
иprimary_key
в определенияхhas_many
иbelongs_to
, чтобы все заработало. 07.10.2020