скажем, если мы сгенерировали модель
rails generate model animal name:string birthday:date
и теперь мы хотим создать другую модель для наследования (например, Dog и Cat), Должны ли мы использовать rails Генерировать модель
снова или просто добавить файлы сами? Как мы можем указать, что Dog должен наследовать от Animal, если мы используем rails Generate Model
?
Я думаю, что если мы будем использовать rails Generate Model
вместо того, чтобы добавлять файлы модели самостоятельно, будет Файлы модульного тестирования и файлы фикстур, созданные для нас. Файл миграции также добавляется, за исключением случаев, когда он использует MongoDB, тогда файл миграции не будет.
Если Собака
, Кошка
и другие подклассы, которые вы планируете, не собираются отклоняться от модели Животных
, вы можете STI (Single Table Inheritance) здесь.
Для этого добавьте столбец String
в Animal
. И тогда вы можете:
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">
Сгенерировать модель Собака
$ 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 в скрипте/ сгенерировать вызов (хотя вы можете захотеть, чтобы миграция добавила, например, столбцы, относящиеся к собакам, в таблицу животных, и вам нужно будет добавить столбец типа
строки типа в таблицу животных).