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