0

晚上好,伙计们,

我有三个脚手架:rails 生成脚手架 person alter:integer, name:string

rails 生成脚手架训练器

轨道生成脚手架运动者

 class Person < ActiveRecord::Base
   attr_accessible :alter, :name
 end

 class Sportler < Person
    belongs_to :trainer
 end

 class Trainer < Person
   has_many :sportler
 end

我已在运动者和教练视图/_form.html.erb 中添加此代码

 <div class="field">
     <%= f.label :name %><br />
     <%= f.text_field :name %>
   </div>
  <div class="field">
     <%= f.label :alter %><br />
     <%= f.number_field :alter %>
   </div>

然后我添加了一些教练和运动员,然后我查看了数据库。有一张供人、教练员和运动员使用的表。 但是所有条目都在 peple_table 中。出了什么问题?

people 表具有 name 和 alter 作为列。Trainers and Sportlers 没有这些栏目。

4

2 回答 2

1

当您为其创建脚手架时TrainerSportler它们被视为单独的模型,因此它们在数据库中拥有自己的表。而且由于您没有指定任何列,因此他们没有得到任何列。

然后,当您为子类化PersonTrainerSportler我猜 rails 假定您正在使用单表继承,因此它们都存储在people表中。如果你想要这种行为,你应该添加一typepeople我认为。

我不确定您是否可以在模型中显式设置表名(应该是这样的): set_table_name "sportlers"并将set_table_name "trainers"它们放入自己的表中。

于 2013-02-09T23:57:52.927 回答
0

要在 Rails 中使用 STI,您需要将 type:string 字段添加到您的父模型。

rails generate scaffold person alter:integer, name:string, type:string

之后,您不需要为您的子类搭建脚手架。只需创建新模型文件并从 Person 继承。

Rails 足够聪明,可以使用添加的类型字段来保持子类的持久性。您的子类的工作方式与 ActiveRecord 模型完全相同。如果您使用子类运行以下代码:

Trainer.create(name: 'John')

您将收到一个新的数据库条目,其类型字段值为 Trainer。

于 2015-05-28T14:12:05.303 回答