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
s.custom_fields を試したときの挙動は以下の通りです(上記のコードではこの部分で nil を返すことができましたが、カスタムフィールドを保存しようとしたときに初めてエラーが発生しました)。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 はもう一方の形式を求めているようです。
インデックス名については気にしないのでしょうか?