Fehler: PG::UndefinedColumn. Benutzerdefiniertes Feld erstellt keine Spalte

Fügen benutzerdefinierte Themenfelder eine Spalte zum Themenmodell hinzu? Ich erhalte einen Fehler, der das verneint, und versuche herauszufinden, was ich dagegen tun kann.


Ich habe in der Entwicklung ein benutzerdefiniertes Themenfeld erstellt, wobei ich hier gefolgt bin. Nennen wir es fun_level. Das benutzerdefinierte Feld scheint in der Entwicklung erfolgreich erstellt worden zu sein, denn wenn ich einen Ajax-Aufruf tätige, um ein von mir erstelltes Thema abzurufen, nachdem ich das benutzerdefinierte Feld hinzugefügt habe – etwa ajax("/t/112.json") – funktioniert es: Die Themendaten werden zurückgegeben und zeigen das Feld fun_level mit dem von mir eingegebenen Wert.

Jetzt muss ich jedoch einen Weg finden, programmatisch alle Themen mit einem bestimmten Wert für das benutzerdefinierte Feld abzurufen (z. B. eine Liste aller Themen, bei denen fun_level = ‘super-duper-fun’ ist).

Ich habe in Erwägung gezogen, dafür einen ajax("/search")-Aufruf zu verwenden, aber ich habe es noch nicht zum Laufen gebracht.

Eine andere Methode, die ich in Betracht gezogen habe, war die Verwendung von klassischem Rails: Erstellen eines Controllers, und wenn ich zu einem bestimmten Pfad gehe (/fun_levels/:fun_level), rufe ich die folgende show-Methode auf:

  def show 
   respond_to do |format|
      format.json { render json: Topic.where(fun_level: 'super-duper-fun') }
    end
  end

Dann rufe ich ajax("/fun_levels/super-duper-fun.json") auf…

Diese Strategie mit der show-Methode des Controllers/Ajax-Aufruf funktioniert, wenn ich Themen basierend auf einer ID, einem Titel usw. finde. Aber wenn ich den obigen Code verwende – Topic.where(fun_level: 'super-duper-fun') –, erhalte ich einen internen Serverfehler. Und die Logs besagen:

ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: column topics.fun_level does not exist LINE 1: ... "topics" WHERE "topics"."deleted_at" IS NULL AND "topics"."...

Gibt es eine Möglichkeit, basierend auf einem benutzerdefinierten Feld Themen über eine Controller-Methode abzurufen, wie ich es oben dargestellt habe? (wie bei meinem: { render json: Topic.where(fun_level: 'super-duper-fun') })

Es gibt ein TopicCustomField-Modell. Das ist das, was Sie suchen. Schauen Sie sich vielleicht Topic List Previews (legacy) oder ein anderes Plugin an, das mit Topics arbeitet. Oder suchen Sie im Discourse-Kern nach HasCustomFields.

Danke – ich habe angefangen zu ahnen, dass so etwas im Spiel sein muss. Vielleicht müsste ich also einen Join mit diesem Modell machen (ich muss hier wirklich meine Rails-Kenntnisse auffrischen). Ich habe etwas wie Folgendes versucht:

Topic.joins(:topic_custom_field).where(fun_level: 'super-duper-fun') }

aber ich erhalte den Fehler: ActiveRecord::ConfigurationError (Kann 'Topic' nicht mit der Assoziation 'topic_custom_field' verbinden; vielleicht haben Sie es falsch geschrieben?)

Haben Sie Ideen zur richtigen Syntax?

Ich kann im Moment kein TopicCustomField finden (aber ich habe dir ja gesagt, wo du suchen sollst! :wink)

Hier ist das:

[4] pry(main)> CategoryCustomField.last
=> #<CategoryCustomField:0x000055be74a00bd0
 id: 2,
 category_id: 8,
 name: "enable_accepted_answers",
 value: "true",
 created_at: Mon, 26 Apr 2021 15:45:07.862617000 UTC +00:00,
 updated_at: Mon, 26 Apr 2021 15:45:07.862617000 UTC +00:00>

Also so etwas wie:

tcf = TopicCustomField.where(name: 'fun_level', value: 'super-duper-fun')

Anschließend kannst du die topic_id und ähnliches aus tcf abrufen (es ist ein Array aller Treffer). Wenn du die topic_id kennst, könntest du TopicCustomField.find_by(<alle drei Dinge, um es eindeutig zu machen>) verwenden.

Cool. Danke für die Info. Ich werde es ausprobieren.