我的应用程序中有两个使用STI的模型:Entry和Sugar,它们非常简单。
条目:
# == Schema Information
#
# Table name: entries
#
# id :integer not null, primary key
# created_at :datetime not null
# updated_at :datetime not null
# user_id :integer
# type :string(255)
#
class Entry < ActiveRecord::Base
# attr_accessible :title, :body
belongs_to :user
end
Sugar(请注意注释gem中架构信息中缺少amount
):
# == Schema Information
#
# Table name: entries
#
# id :integer not null, primary key
# created_at :datetime not null
# updated_at :datetime not null
# user_id :integer
# type :string(255)
#
class Sugar < Entry
attr_accessible :amount
end
我通过运行rails g model Sugar amount:integer
创建了Sugar模型,然后将其编辑为Entry模型的子类。生成的迁移创建了一个数量列:
class CreateSugars < ActiveRecord::Migration
def change
create_table :sugars do |t|
t.integer :amount
t.timestamps
end
end
end
该列存在于我的数据库中:
bridges_development=# \d sugars
Table "public.sugars"
Column | Type | Modifiers
------------+-----------------------------+-----------------------------------------------------
id | integer | not null default nextval('sugars_id_seq'::regclass)
amount | integer |
created_at | timestamp without time zone | not null
updated_at | timestamp without time zone | not null
Indexes:
"sugars_pkey" PRIMARY KEY, btree (id)
但是,“amount”属性和/或方法似乎不存在。这是一个例子:
1.9.2-p290 :002 > s.amount = 2
NoMethodError: undefined method `amount=' for #<Sugar:0xb84041c> (...)
1.9.2-p290 :003 > s = Sugar.new(:amount => 2)
ActiveRecord::UnknownAttributeError: unknown attribute: amount (...)
为什么amount
属性和相关方法不可用?
答案 0 :(得分:1)
当你从导入使用STI(单表继承)的条目继承糖时
在此方案中,所有类都存储在基类的表(条目)中,而类型列存储子类的名称。因为它们都共享同一个表,所以它们也共享相同的属性:所有的
都不会使用糖表如果您不想这样,您可以将条目设为抽象类
class Entry < ActiveRecord::Base
self.abstract_class = true
end
在这种情况下,没有条目表,但会有一个糖表(并且每个条目的子类都有一个)。
另一种方法是将Entry和Sugar应该共享的代码放入模块中。
答案 1 :(得分:0)
STI的想法是N型 - 1个表。 Sugar
实际上是访问表entries
,其中没有属性amount
。