대단히 감사합니다, David!
네. 제 문제가 바로 그것일 수 있겠네요. 아마 그 에러 메시지를 포함했어야 했는데요. pfaffmanager_server_id를 필드 이름으로 사용하면 인덱스 이름이 63자를 초과해서 인덱스에 다른 이름을 사용해야 하지만, 어떤 필드를 사용하든 마이그레이션은 작동합니다.
다시 시도해 보겠습니다.
server_id를 필드 이름으로 사용
class CreatePfaffmanagerServerCustomField < ActiveRecord::Migration[6.0]
def change
create_table :pfaffmanager_server_custom_fields do |t|
t.integer :server_id, null: false
t.string :name, limit: 256, null: false
t.text :value
t.timestamps null: false
end
add_index :pfaffmanager_server_custom_fields, [:server_id, :name]
end
end
저장 시 다음 에러가 발생합니다:
Pfaffmanager::ServerCustomField Load (3.8ms) SELECT "pfaffmanager_server_custom_fields".* FROM "pfaffmanager_server_custom_fields" WHERE "pfaffmanager_server_custom_fields"."server_id" = 1
(1.4ms) ROLLBACK
PG::UndefinedColumn: ERROR: column "pfaffmanager_server_id" of relation "pfaffmanager_server_custom_fields" does not exist
LINE 1: INSERT INTO pfaffmanager_server_custom_fields (pfaffmanager_...
^
즉, pfaffmanager_server_id를 찾고 있습니다. 이제 pfaffmanager_server_id를 사용해 보겠습니다.
pfaffmanager_server_id를 필드 이름으로 사용
마이그레이션은 다음과 같습니다:
class CreatePfaffmanagerServerCustomField < ActiveRecord::Migration[6.0]
def change
create_table :pfaffmanager_server_custom_fields do |t|
t.integer :pfaffmanager_server_id, null: false
t.string :name, limit: 256, null: false
t.text :value
t.timestamps null: false
end
add_index :pfaffmanager_server_custom_fields,
[:pfaffmanager_server_id, :name],
name: 'index_pfaffmanager_server_custom_fields_on_server_id_and_name'
end
end
save를 시도했을 때 저장을 시도하기 전까지는 nil을 반환할 수 있었지만, 커스텀 필드를 저장하려고 했을 때 실패했습니다. s.custom_fields를 시도하면 다음과 같은 일이 발생합니다. register_custom_field_type는 여기)에서 수행됩니다:
pry(main)> s.custom_fields
(1.1ms) SELECT "pfaffmanager_server_custom_fields"."name", "pfaffmanager_server_custom_fields"."value" FROM "pfaffmanager_server_custom_fields" WHERE "pfaffmanager_server_custom_fields"."server_id" = 1 ORDER BY id asc
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column pfaffmanager_server_custom_fields.server_id does not exist
LINE 1: ...e" FROM "pfaffmanager_server_custom_fields" WHERE "pfaffmana...
^
from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/rack-mini-profiler-2.3.0/lib/patches/db/pg.rb:69:in `exec_params'
Caused by PG::UndefinedColumn: ERROR: column pfaffmanager_server_custom_fields.server_id does not exist
LINE 1: ...e" FROM "pfaffmanager_server_custom_fields" WHERE "pfaffmana...
^
이제 server_id를 찾고 있습니다.
즉, custom_fields는 한쪽 방향으로, save_custom_fields는 다른 방향으로 요구하는 것 같습니다.
인덱스 이름은 상관없나요?