我有一些模型设置了命名空间。
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
.在控制器中,我可以有一个基本的@posts = Technology::Post.all
,这仍然会发生。
重新启动服务器将解决问题,直到再次发生。这在我们的生产环境中也不是问题。只有发展。
有三件事正在发生。
首先,请确保您拥有最新版本的 pg 宝石。
Udit 的答案,设置表名,可能会起作用。但这是一种解决方法。我相信问题的原因以及开箱即用的原因如下:
生成命名空间模型时,Rails 会创建一个模块文件,如下所示:
module Technology
def self.table_name_prefix
'technology_'
end
end
但是,如果您在其他地方定义常量/模块"技术",Rails 可能不会自动加载此文件!您可以通过在文件顶部放置一些调试puts
来进行测试。
解决方案是确保此模块按显式要求加载,或将其转移到模型。例如
module Technology
def self.table_name_prefix
'technology_'
end
class Post < ActiveRecord::Base
...
end
end
试试这个:
self.table_name = 'NAME OF YOUR TABLE'