"ActiveRecord::StatementInvalid: Could not find table" 在 rails 模型继承中

"ActiveRecord::StatementInvalid: Could not find table" in rails model inheritance

当我运行

irb(main):003:0> House.new(name: "A house")

我收到错误

ActiveRecord::StatementInvalid: Could not find table 'houses'
    from /home/overflow012/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/sqlite3_adapter.rb:429:in `table_structure'
...

你可以在下面看到我的代码

property.rb

class Property < ApplicationRecord
    self.abstract_class = true
end

apartment.rb

class Apartment < Property
end

house.rb

class House < Property
end

db/migrate/20160616022800_create_properties.rb

class CreateProperties < ActiveRecord::Migration[5.0]
  def change
    create_table :properties do |t|
      t.string :name
      t.string :detail
      t.float :price
      t.string :type
      t.timestamps
    end
  end
end

属性 table 是通过 rake db:migrate 创建的 注意:我正在使用rails 5.0.0.rc1

我做错了什么?

我认为您需要从 Property 模型中删除 self.abstract_class 行。

abstract_class 添加到模型中将强制子 classes 绕过父 class Property 的隐含 STI table 命名。本质上,我们是说 Property 不能再被实例化,并且不受数据库支持 table.

因此,Property 的子 class 不会向父 class 查找 table 名称,他们会查找 table 根据自己的 class 名字。

或者,您可以在 Property 模型中设置 self.table_name = 'properties',这应该有效。但是,这违背了定义 abstract_class.

的目的