Rails在命名空间模型之后无法找到表格

时间:2014-08-01 21:06:51

标签: ruby-on-rails

将模型移动到rails引擎后,我遇到了问题。它现在在引擎下被命名空间,但我收到一个错误,即“表不存在”。是否需要清除某种ActiveRecord缓存?

以前的文件是

.
└── _app
    └── _models
        └── _foo.rb

它看起来像这样

class Foo < ActiveRecord::Base
  belongs_to :bar
end

> Foo
=> Foo(id: integer, bar_id: integer)

我把它移到了

.
└── _components
    └── _my_engine
        └── _app
            └── _models
                └── _my_engine
                    └── _foo.rb

现在看起来像这样:

module MyEngine
  class Foo < ActiveRecord::Base
    belongs_to :bar
  end
end

现在:

> MyEngine::Foo
=> MyEngine::Foo(Table doesn't exist)
> Foo
=> NameError: uninitialized constant Foo

我的structure.rb看起来像这样:

CREATE TABLE foos (
    id integer NOT NULL,
    bar_id integer
);

为什么不再识别这张桌子?

3 个答案:

答案 0 :(得分:3)

添加以下文件:

# app/models/my_engine.rb
module MyEngine
  def self.table_name_prefix
    'my_engine_'
  end
end

确保您的表名称遵循约定。

# db/migrate/timestamp_rename_foo_to_my_engine_foos.rb
def change
  rename_table :foos, :my_engine_foos
end

答案 1 :(得分:-1)

在这里,尝试使用此类名称。

module MyEngine
  class Foo < ActiveRecord::Base
    belongs_to :bar , class_name: "::#{Rails.application.class.parent_name}::Foo"
  end
end

答案 2 :(得分:-1)

我发现Rails现在也希望表名也是名称空间。所以我把我的课程看起来像这样:

module MyEngine
  class Foo < ActiveRecord::Base
    self.table_name = 'foos'
    self.primary_key = 'id' 

    belongs_to :bar
  end
end

..而且效果很好。