Errore: PG::UndefinedColumn. Il campo personalizzato non crea una colonna

I campi personalizzati per gli argomenti aggiungono una colonna al modello degli argomenti? Sto ricevendo un errore che dice di no e sto cercando di capire come risolvere il problema.


Ho creato un campo personalizzato per gli argomenti in ambiente di sviluppo, seguendo questa guida. Chiamiamolo fun_level. Il campo personalizzato sembra essere stato creato correttamente in sviluppo, perché se faccio una chiamata AJAX per recuperare un argomento che ho creato dopo aver aggiunto il campo personalizzato—ad esempio ajax("/t/112.json")—funziona: i dati dell’argomento vengono restituiti mostrando il campo fun_level con il valore che ho inserito.

Ma ora devo trovare un modo per recuperare programmaticamente tutti gli argomenti con un certo valore per il campo personalizzato (ad esempio, ottenere un elenco di tutti gli argomenti in cui fun_level = ‘super-duper-fun’).

Ho pensato di fare una chiamata ajax("/search") a questo scopo, ma non sono ancora riuscito a farla funzionare.

Un altro metodo che ho considerato è utilizzare il classico Rails: creare un controller e, quando accedo a un certo percorso (/fun_levels/:fun_level), chiamare il seguente metodo show:

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

Poi, chiamo ajax("/fun_levels/super-duper-fun.json")

Questa strategia di metodo show/chiamata AJAX del controller funziona se sto cercando argomenti in base a un ID, titolo, ecc. Ma quando uso il codice sopra—Topic.where(fun_level: 'super-duper-fun')—mi viene restituito un errore interno del server. E nei log c’è scritto:

ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: la colonna topics.fun_level non esiste LINE 1: ... "topics" WHERE "topics"."deleted_at" IS NULL AND "topics"."...

Esiste un modo per recuperare gli argomenti in base a un campo personalizzato utilizzando un metodo del controller, come ho mostrato sopra? (come il mio: { render json: Topic.where(fun_level: 'super-duper-fun') })

Esiste un modello TopicCustomField. Potrebbe essere quello che cerchi. Prova a dare un’occhiata a Topic List Previews (legacy) o a qualche altro plugin che modifica i topic. In alternativa, cerca HasCustomFields nel codice principale di Discourse.

Grazie, stavo iniziando a pensare che qualcosa del genere stesse succedendo. Quindi forse dovrei fare un join con quel modello (devo davvero rispolverare le mie conoscenze su Rails). Ho provato qualcosa del genere:

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

ma ottengo l’errore: ActiveRecord::ConfigurationError (Non è possibile eseguire il join di 'Topic' all'associazione denominata 'topic_custom_field'; forse l'hai scritta male?)

Hai qualche idea sulla sintassi corretta?

Non riesco a trovare un TopicCustomField in questo momento (ma ti ho detto dove guardare! :wink)

Ecco questo:

[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>

Quindi qualcosa del genere:

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

Poi puoi ottenere l’topic_id e così via da tcf (è un array di tutte le corrispondenze). Se conosci l’topic_id, puoi fare un TopicCustomField.find_by(<tutti e tre gli elementi per renderlo unico>).

Bene. Grazie per le informazioni. Provaci.

1 Mi Piace