Error: PG::UndefinedColumn. El campo personalizado no crea columna

¿Los campos personalizados de temas agregan una columna al modelo de temas? Estoy recibiendo un error que dice que no, y estoy tratando de averiguar qué hacer al respecto.


He creado un campo personalizado de tema en el entorno de desarrollo, siguiendo este enlace. Llamémoslo fun_level. El campo personalizado parece haberse creado correctamente en desarrollo, porque si hago una llamada AJAX para obtener un tema que creé después de agregar el campo personalizado (por ejemplo, ajax("/t/112.json")), funciona: los datos del tema se devuelven mostrando el campo fun_level con el valor que ingresé.

Pero ahora necesito encontrar una manera de recuperar programáticamente todos los temas con un valor específico para el campo personalizado (por ejemplo, obtener una lista de todos los temas donde fun_level = ‘super-duper-fun’).

He considerado hacer una llamada ajax("/search") para eso, pero aún no he logrado que funcione.

Otro método que pensé fue usar Rails clásico: crear un controlador y, cuando vaya a una ruta determinada (/fun_levels/:fun_level), llamar al siguiente método show:

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

Luego, llamo a ajax("/fun_levels/super-duper-fun.json")

Esta estrategia de método show del controlador y llamada AJAX funciona si estoy buscando temas basándome en un ID, título, etc. Pero cuando uso el código anterior: Topic.where(fun_level: 'super-duper-fun'), se produce un error interno del servidor. Y los registros indican:

ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: la columna topics.fun_level no existe LINE 1: ... "topics" WHERE "topics"."deleted_at" IS NULL AND "topics"."...

¿Existe alguna manera de obtener temas basados en un campo personalizado utilizando un método de controlador, como el que he proporcionado arriba? (como mi: { render json: Topic.where(fun_level: 'super-duper-fun') })

Hay un modelo TopicCustomField. Ese es el que necesitas. Quizás eches un vistazo a Topic List Previews (legacy) o a algún otro plugin que modifique los temas. O tal vez busques HasCustomFields en el núcleo de Discourse.

Gracias, estaba empezando a pensar que algo así debía estar ocurriendo. Quizás necesite hacer un join con ese modelo (realmente tengo que desempolvar mis conocimientos de Rails). He probado algo como esto:

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

pero obtengo el error: ActiveRecord::ConfigurationError (No se puede hacer join de 'Topic' a la asociación llamada 'topic_custom_field'; ¿quizás la escribiste mal?)

¿Alguna idea sobre la sintaxis correcta?

No puedo encontrar un TopicCustomField en este momento (¡pero te dije dónde buscar! :wink)

Aquí está esto:

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

Así que algo como:

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

Luego puedes obtener el topic_id y demás desde tcf (es un array de todas las coincidencias). Si conoces el topic_id, podrías hacer un TopicCustomField.find_by(<los tres elementos para hacerlo único>).

Genial. Gracias por la información. Lo probaré.