gpt4 book ai didi

ruby-on-rails - 继续获取带有命名空间模型的 PG::UndefinedTable

转载 作者:行者123 更新时间:2023-11-29 11:34:24 27 4
gpt4 key购买 nike

我有一些模型设置了命名空间..

rails g model Technology::Post ...

这导致了错误

PG::UndefinedTable: ERROR:  relation "posts" does not exist
LINE 5: WHERE a.attrelid = '"posts"'::regclass
:SELECT a.attname, format_type(a.atttypid, a.atttypmod),
pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
FROM pg_attribute a LEFT JOIN pg_attrdef d
ON a.attrelid = d.adrelid AND a.attnum = d.adnum
WHERE a.attrelid = '"posts"'::regclass
AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum

因为这些是命名空间的,所以我有一个模型 technology.rb

module Technology
def self.table_name_prefix
'technology_'
end
end

当然还有 Technology::Post 模型。此模型位于文件夹 technology 中,名为 post.rb

class Technology::Post < ActiveRecord::Base
...
end

我的数据库名称是 technology_posts

public | technology_posts                  | table | postgres

但出于某种原因,它正在寻找表 posts。在 Controller 中,我可以有一个基本的 @posts = Technology::Post.all,这仍然会发生。

重新启动服务器将解决问题,直到它再次发生。这在我们的生产环境中也不是问题。只有发展。

最佳答案

发生了三件事。

首先,确保您拥有最新版本的 pg gem。

Udit 的答案,设置表名,可能会起作用。但这是一种解决方法。我认为问题的原因和开箱即用的原因如下:

当您生成命名空间模型时,Rails 会创建一个如下所示的模块文件:

module Technology
def self.table_name_prefix
'technology_'
end
end

但是,如果您在别处定义常量/模块“Technology”,Rails 可能不会自动加载此文件!您可以通过在文件顶部放置一些调试 puts 来进行测试。

解决方案是确保通过显式要求加载此模块,或将其转移到模型中。例如,

module Technology
def self.table_name_prefix
'technology_'
end
class Post < ActiveRecord::Base
...
end
end

关于ruby-on-rails - 继续获取带有命名空间模型的 PG::UndefinedTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26934064/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com