繁体   English   中英

在Ruby on Rails中,如果我们生成了一个模型“Animal”,现在想拥有“Dog”,我们应该怎么做呢?

[英]In Ruby on Rails, if we generated a model “Animal”, and now want to have “Dog”, how should we do it?

比如说,如果我们生成了一个模型

rails generate model animal name:string birthday:date

现在我们想要创建其他模型来继承它(比如Dog和Cat),我们应该再次使用rails generate model还是自己添加文件? 如果我们使用rails generate model我们如何指定Dog应该继承Animal?

我想如果我们使用rails generate model而不是自己添加模型文件,那么也会为我们创建单元测试文件和fixture文件。 还添加了迁移文件,除非它使用MongoDB,否则将不会有迁移文件。

如果你计划的DogCat和其他子类不会偏离Animal模型,那么你可以在这里使用STI(单表继承)模式。

为此,请向Animal添加一个String列。 然后你可以:

class Dog < Animal
end

class Cat < Animal
end

>> scooby = Dog.create(:name => 'Scooby', :date => scoobys_birthdate)
=> #<Dog id: 42, date: "YYYY-MM-DD", type: "Dog">

生成模型Dog

$ script/generate model Dog --skip-migration

然后改变(通常是app/models/dog.rb ):

class Dog < ActiveRecord::Base

class Dog < Animal

据我所知,在生成模型时无法指定超类。 但是,生成器只是创建类的跳板。 您可以正常生成模型类,只需更改生成的模型文件中的超类。 没有其他地方必须为生成的文件指定继承关系(例如,灯具和单元测试不指定超类或子类)。

所以:

script/generate model Dog

然后改变:

class Dog < ActiveRecord::Base

至:

class Dog < Animal

如果要生成一个将使用单表继承从Animal继承的模型,那么您可能希望在脚本/生成调用上指定--skip-migrations(尽管您可能希望迁移添加例如特定于狗的列到动物表,您需要在animals表中添加string type列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM