Verwendung von HasCustomFields in einem Plugin

Vielen Dank, David!

Ja, das könnte mein Problem sein. Ich vermute, das ist die Fehlermeldung, die ich hätte einfügen sollen. Und ich kann die Migration mit beiden Feldnamen zum Laufen bringen (obwohl bei pfaffmanager_server_id als Feldname der Indexname länger als 63 Zeichen wird, sodass ich einen anderen Namen für den Index verwenden muss).

Lass es mich noch einmal versuchen.

server_id als Feldname

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

Fehlschlag beim Speichern mit:

 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_...
                                                       ^

Es wird also nach pfaffmanager_server_id gesucht. Nun verwenden wir pfaffmanager_server_id.

pfaffmanager_server_id als Feldname

Hier ist die Migration:

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

Hier ist, was passiert, wenn ich s.custom_fields versuche (das obige konnte nil dafür zurückgeben, aber es trat kein Fehler auf, bis ich versuchte, ein benutzerdefiniertes Feld zu speichern). Ich rufe register_custom_field_type hier auf:

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

Jetzt wird nach server_id gesucht.

Es scheint also, als ob custom_fields es auf die eine Art und save_custom_fields auf die andere Art haben möchte.

Ist es ihm egal, wie der Indexname lautet, oder?