16

因此,我正在使用无法转换到 Rails 的现有数据库迁移这个 php 站点。有一个表:Quotes有一个名为 的列type。每当我尝试创建此模型并设置类型时,它都会告诉我以下错误:

ActiveRecord::SubclassNotFound (Invalid single-table inheritance type: HOME is not a subclass of Quotes)

我不明白为什么它认为它是继承的,因为它不应该这样做。我的创建方法如下所示:

quote = Quotes.create(
  agent_id: agent.id,
  client_id: client.id,
  type: 'HOME',
  status: 0,
  date_created: DateTime.now 
)

如果我注释掉类型,一切正常。但是使用类型它会出错。

4

2 回答 2

50

我通过将模型继承列设置为 nil 解决了这个问题。Active Record 模型可以通过属性从表继承:type,将inheritance_column 设置为nil 会删除该属性,从而允许您拥有一个名为的数据库列type

class Quote < ActiveRecord::Base
    self.inheritance_column = nil
end
于 2013-08-15T15:04:33.017 回答
3

我讨厌在代码深处有潜在的陷阱,尤其是在生成模型等初始过程中。如果需要,最好将保留字更改为其他内容,然后腾出时间来利用继承列。此处列出了更简洁的解决方案 -> 使用迁移重命名数据库列名

上面写着;

  1. 执行 $> rails generate migration ChangeColumnName 其中,ChangeColumnName 是我们迁移的名称。这可以是任何名称。
  2. 现在,在 db/migrate/_change_column_name.rb 编辑生成的迁移文件

    class ChangeColumnName < ActiveRecord::Migration
    def change
    rename_column :table_name, :old_column, :new_column
    end
    end
    
  3. $> 耙分贝:迁移

您将不得不编辑控制器并查看文件,例如,如果型号名称是 Product,那么您可能会编辑这些文件

  1. /app/views/products/_form.html.erb
  2. /app/views/products/show.html.erb
  3. /app/controllers/products_controller.erb
  4. /app/views/products/index.html.erb
于 2014-08-03T12:38:52.690 回答