我是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产品和产品属于一个类别。
答案 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
(或其他名称)中进行设置