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

nop*_*ole 7 inheritance ruby-on-rails single-table-inheritance rails-models

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

rails generate model animal name:string birthday:date
Run Code Online (Sandbox Code Playgroud)

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

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

Swa*_*and 6

如果Dog,Cat你正在计划和其他子类都不会发散远离Animal模型,您可以STI(单表继承)模式在这里.

为此,请添加一StringAnimal.然后你可以:

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">
Run Code Online (Sandbox Code Playgroud)

生成模型 Dog

$ script/generate model Dog --skip-migration
Run Code Online (Sandbox Code Playgroud)

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

class Dog < ActiveRecord::Base
Run Code Online (Sandbox Code Playgroud)

class Dog < Animal
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过指定`--parent`标志来生成模型时定义超类.见[this](http://stackoverflow.com/a/14569424)帖子.从我观察到的情况来看,它也不会产生任何迁移. (4认同)

Sha*_*ell 3

据我所知,在生成模型时不能指定超类。然而,生成器只是创建类的垫脚石。您可以正常生成模型类,只需更改生成的模型文件中的超类即可。没有其他地方需要指定继承关系才能使生成的文件正常工作(例如,固定装置和单元测试不指定超类或子类)。

所以:

script/generate model Dog
Run Code Online (Sandbox Code Playgroud)

然后改变:

class Dog < ActiveRecord::Base
Run Code Online (Sandbox Code Playgroud)

到:

class Dog < Animal
Run Code Online (Sandbox Code Playgroud)

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

  • 这需要一个名为“type”的字符串列出现在“Animal”中。 (2认同)