非常感谢你,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 却想要另一种。
它并不在意索引名称是什么,对吧?