Erro: PG::UndefinedColumn. Campo personalizado não está criando coluna

Os campos personalizados de tópico adicionam uma coluna ao modelo de tópicos? Estou recebendo um erro dizendo que não, e estou tentando descobrir o que fazer a respeito.


Criei um campo personalizado de tópico em desenvolvimento, seguindo este guia. Vamos chamá-lo de fun_level. O campo personalizado parece ter sido criado com sucesso em desenvolvimento, pois se eu fizer uma chamada AJAX para buscar um tópico que criei após adicionar o campo personalizado — como ajax("/t/112.json") — funciona: os dados do tópico retornam mostrando o campo fun_level com o valor que inseri.

Mas agora preciso encontrar uma maneira de recuperar programáticamente todos os tópicos com um determinado valor para o campo personalizado (por exemplo, obter uma lista de todos os tópicos onde fun_level = ‘super-duper-fun’).

Considerei fazer uma ajax("/search") para isso, mas ainda não consegui fazer funcionar.

Outro método que pensei foi usar o Rails clássico: criar um controlador e, ao acessar um determinado caminho (/fun_levels/:fun_level), chamar o seguinte método show:

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

Em seguida, chamo ajax("/fun_levels/super-duper-fun.json")

Essa estratégia de método show/chamada AJAX do controlador funciona se eu estiver buscando tópicos com base em um ID, título, etc. Mas quando uso o código acima — Topic.where(fun_level: 'super-duper-fun') — ele retorna um erro interno do servidor. E os logs dizem:

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

Existe alguma maneira de obter tópicos com base em um campo personalizado usando um método de controlador, como o que forneci acima? (como no meu: { render json: Topic.where(fun_level: 'super-duper-fun') })

Existe um modelo TopicCustomField. Você precisa dele. Talvez dê uma olhada em Topic List Previews (legacy) ou em algum outro plugin que manipula tópicos. Ou talvez veja HasCustomFields em algum lugar do núcleo do Discourse.

Obrigado—eu estava começando a achar que algo assim estava acontecendo. Então, talvez eu precise fazer um join com esse modelo (realmente precisando tirar minha Rails do baú). Eu tentei algo assim:

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

mas recebi o erro: ActiveRecord::ConfigurationError (Não é possível fazer join em 'Topic' com a associação chamada 'topic_custom_field'; talvez você tenha digitado errado?)

Alguma ideia sobre a sintaxe correta?

Não consigo encontrar um TopicCustomField neste momento (mas eu te disse onde procurar! :wink)

Aqui está isso:

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

Então algo como

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

Depois, você pode obter o topic_id e outros dados de tcf (é um array de todas as correspondências). Se você souber o topic_id, poderia fazer um TopicCustomField.find_by(<todos os três itens para torná-lo único>).

Legal. Obrigado pela informação. Vou experimentar.

1 curtida