" ActiveRecord :: StatementInvalid:找不到表"在rails模型继承中

时间:2016-06-17 00:35:20

标签: ruby-on-rails activerecord ruby-on-rails-5

当我跑步时

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

分贝/迁移/ 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

属性表是通过rake db:migrate创建的 enter image description here 注意:我使用的是rails 5.0.0.rc1

我做错了什么?

1 个答案:

答案 0 :(得分:1)

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

abstract_class添加到模型将强制子类绕过父类Property的隐含STI表命名。从本质上讲,我们说Property不能再实例化,也没有数据库表支持。

因此,Property的子类不会向父类查找表名,他们会根据自己的类名查找表。

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