"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
.
的目的
当我运行
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
创建的
我做错了什么?
我认为您需要从 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
.