ActiveRecord :: SubclassNotFound:单表继承机制无法找到子类

时间:2013-07-26 10:28:58

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

我是Rails的新手 我有两个模型类别产品,如下所示: -

class Category < ActiveRecord::Base
 attr_accessible :type

 has_many :products
end

class Product < ActiveRecord::Base
 attr_accessible :category_id, :color, :price, :title

 belongs_to :category
end

我的 schema.rb 如下: -

ActiveRecord::Schema.define(:version => 20130725220046) do

create_table "categories", :force => true do |t|
    t.string   "type"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

  create_table "products", :force => true do |t|
    t.integer  "category_id"
    t.decimal  "price",       :precision => 10, :scale => 0
    t.string   "title"
    t.string   "color"
    t.datetime "created_at",                                 :null => false
    t.datetime "updated_at",                                 :null => false
  end

end

在Rails控制台中,我使用 Product.create 命令创建了两个带有两个产品的产品

[#<Product id: 1, category_id: 1, price: 500, title: "shirt", color: "blue", `created_at: "2013-07-25 22:04:54", updated_at: "2013-07-25 22:04:54">, #<Product id: 2, category_id: 1, price: 600, title: "tees", color: "black", created_at: "2013-07-25 22:05:17", updated_at: "2013-07-25 22:05:17">]`  

使用控制台

中的 Category.create 命令创建了两个类别
<Category id: 1, type: "clothing", created_at: "2013-07-25 22:03:54", updated_at: "2013-07-25 22:03:54"><Category id: 2, type: "footwear", created_at: "2013-07-25 22:04:02", updated_at: "2013-07-25 22:04:02">  

现在, Product.all 工作正常但 Category.all 提供

  

ActiveRecord :: SubclassNotFound:单表继承机制无法找到子类:'clothing'。引发此错误是因为列'type'保留用于在继承的情况下存储类。如果您不打算将此列用于存储继承类或覆盖Category.inheritance_column以使用另一列来获取该信息,请重命名此列。

那里有什么问题?我想在类别和产品之间建立关系,如
一个类别has_many产品和产品属于一个类别。

6 个答案:

答案 0 :(得分:90)

type是限制词,您不能在ActiveRecord模型中将其用作列名(除非您正在进行STI)。

答案 1 :(得分:22)

尝试使用inheritance_column,然后不再保留type:

class Category < ActiveRecord::Base
 self.inheritance_column = :foo
 attr_accessible :type

 has_many :products
end

class Product < ActiveRecord::Base
 attr_accessible :category_id, :color, :price, :title

 belongs_to :category
end

答案 2 :(得分:13)

刚尝试使用此type保留字找到我自己问题的解决方案时遇到过这篇文章,所以也许这可以帮助其他人。

更改列名称对我来说不是一个简单的解决方案,因为我正在处理从mongodb迁移到活动记录的现有完整系统。

我发现将self.inheritance_column = :_type_disabled添加到模型中,并使用违规列名修复了我发现here的错误。

  

禁用STI

     

我不得不添加“self.inheritance_column”而不是简单   “inheritance_column”让这个工作。代码示例

     

类MyModel&lt; ActiveRecord :: Base#禁用STI
  self.inheritance_column =:_ type_disabled end

我知道我们没有使用任何遗产,所以我认为这样做对我来说没什么问题但是我不知道因为它可能会有什么其他影响。如果其他人对此有任何意见,我有兴趣知道。

如果您只是更改列名并避免这样做,那么我确定这是一个更好的解决方案。

答案 3 :(得分:3)

如果有人实际上试图启动STI,请尝试添加一个从父级继承的新类,并且相关的错误消息应该消失。

class YourSubclass < Category
end

答案 4 :(得分:2)

如果您发现此问题是因为遇到了同样的错误,并且您实际上正在使用Rails STI,但由于您尝试重命名继承的子类而得到错误,可能是因为您在{{1}中有旧数据}列并忘了更新它。然后这个rake任务可能会有所帮助:

type

update_category_type_column_with_new_subclass_names.rake

答案 5 :(得分:0)

如果您当前的AR模型未使用STI,则可以在模型self.inheritance_column = :sti_disabled(或其他名称)中进行设置