Erreur : PG::UndefinedColumn. Le champ personnalisé ne crée pas de colonne

Les champs personnalisés pour les sujets ajoutent-ils une colonne au modèle des sujets ? J’obtiens une erreur indiquant que non, et j’essaie de comprendre comment résoudre ce problème.


J’ai créé un champ personnalisé pour les sujets en développement, en suivant cette procédure. Appelons-le fun_level. Le champ personnalisé semble être créé avec succès en développement, car si j’effectue un appel AJAX pour récupérer un sujet que j’ai créé après avoir ajouté le champ personnalisé — par exemple ajax("/t/112.json") — cela fonctionne : les données du sujet sont renvoyées avec le champ fun_level contenant la valeur que j’ai saisie.

Mais maintenant, je dois trouver un moyen de récupérer programmatiquement tous les sujets ayant une valeur spécifique pour ce champ personnalisé (par exemple, obtenir la liste de tous les sujets où fun_level = ‘super-duper-fun’).

J’ai envisagé d’utiliser un ajax("/search") pour cela, mais je n’ai pas encore réussi à le faire fonctionner.

Une autre méthode que j’ai envisagée consiste à utiliser Rails classique : créer un contrôleur et, lorsque j’accède à un chemin spécifique (/fun_levels/:fun_level), appeler la méthode show suivante :

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

Ensuite, j’appelle ajax("/fun_levels/super-duper-fun.json")

Cette stratégie de méthode show dans le contrôleur et d’appel AJAX fonctionne si je cherche des sujets basés sur un identifiant, un titre, etc. Mais lorsque j’utilise le code ci-dessus — Topic.where(fun_level: 'super-duper-fun') — cela renvoie une erreur de serveur interne. Et les journaux indiquent :

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

Existe-t-il un moyen de récupérer des sujets basés sur un champ personnalisé en utilisant une méthode de contrôleur, comme je l’ai montré ci-dessus ? (par exemple : { render json: Topic.where(fun_level: 'super-duper-fun') })

Il existe un modèle TopicCustomField. C’est probablement ce qu’il vous faut. Vous pourriez consulter Topic List Previews (legacy) ou un autre plugin qui modifie les sujets. Ou peut-être cherchez-vous HasCustomFields quelque part dans le cœur de Discourse.

Merci — je commençais à penser que quelque chose de ce genre devait se produire. Il faudrait donc peut-être faire un jointure avec ce modèle (je dois vraiment rafraîchir mes connaissances sur Rails ici). J’ai essayé quelque chose comme ceci :

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

mais j’obtiens l’erreur : ActiveRecord::ConfigurationError (Impossible de joindre 'Topic' à l'association nommée 'topic_custom_field' ; l'avez-vous mal orthographié ?)

Avez-vous des idées sur la bonne syntaxe ?

Je ne parviens pas à trouver de TopicCustomField pour l’instant (mais je t’avais dit où chercher ! :wink)

Voici ce que j’ai :

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

Donc quelque chose comme :

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

Ensuite, tu peux récupérer le topic_id et autres depuis tcf (c’est un tableau de toutes les correspondances). Si tu connais le topic_id, tu pourrais faire un TopicCustomField.find_by(<les trois éléments pour le rendre unique>).

Cool. Merci pour les infos. Je vais tester ça.

1 « J'aime »