继续使用命名空间模型获取PG :: UndefinedTable

时间:2014-11-14 16:04:03

标签: ruby-on-rails postgresql ruby-on-rails-4

我有一些使用命名空间设置的模型..

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,这仍然会发生。

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

2 个答案:

答案 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'