错误:PG::UndefinedColumn。自定义字段未创建列

主题自定义字段是否会在主题模型中添加一列?我收到了一个错误提示说没有,我正在尝试找出解决办法。


我按照此处的说明在开发环境中创建了一个主题自定义字段。我们称之为 fun_level。该自定义字段似乎已在开发环境中成功创建,因为如果我通过 AJAX 调用获取我添加了该自定义字段后创建的主题(例如 ajax("/t/112.json")),调用是成功的:返回的主题数据中包含了 fun_level 字段及其我输入的值。

但现在我需要找到一种方法,以编程方式检索具有特定自定义字段值的所有主题(例如,获取所有 fun_level 等于 ‘super-duper-fun’ 的主题列表)。

我曾考虑使用 ajax("/search") 来实现,但尚未成功

我想到的另一种方法是使用经典的 Rails 方式:创建一个控制器,当访问特定路径(/fun_levels/:fun_level)时,调用以下 show 方法:

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

然后,我调用 ajax("/fun_levels/super-duper-fun.json")……

如果我是根据 ID、标题等查找主题,这个“控制器 show 方法/AJAX 调用”策略是有效的。但是当我使用上述代码 Topic.where(fun_level: 'super-duper-fun') 时,它会返回一个“内部服务器错误”。日志显示:

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

有没有办法像我上面提供的那样,通过控制器方法根据自定义字段获取主题?(就像我的:{ render json: Topic.where(fun_level: 'super-duper-fun') }

有一个 TopicCustomField 模型,这正是你想要的。不妨看看 https://meta.discourse.org/t/topic-list-previews/101646,或者研究一下其他对主题进行操作的插件。也可以尝试在 Discourse 核心代码中查找 HasCustomFields。

谢谢——我刚开始觉得可能就是这样。所以我可能需要用那个模型做一个关联查询(真得重新捡起我的 Rails 知识了)。我试过类似这样的写法:

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

但我收到了错误:ActiveRecord::ConfigurationError (无法将 'Topic' 关联到名为 'topic_custom_field' 的关联;也许你拼写错了?)

关于正确的语法有什么建议吗?

我暂时找不到 TopicCustomField(但我已经告诉过你该去哪里找了!:wink:

这是这个:

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

所以类似这样:

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

然后你可以从 tcf 中获取 topic_id 等信息(它是一个包含所有匹配项的数组)。如果你知道 topic_id,可以使用 TopicCustomField.find_by(<这三个能确保唯一性的条件>)

好的,谢谢提供的信息。我会尝试一下。

1 个赞