继续获取PG::UndefinedTable with namespaced Model



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

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'

最新更新