В Ruby on Rails, если мы сгенерировали модель «Animal» и теперь хотим иметь «Dog», как мы должны это сделать?

скажем, если мы сгенерировали модель

rails generate model animal name:string birthday:date

и теперь мы хотим создать другую модель для наследования (например, Dog и Cat), Должны ли мы использовать rails Генерировать модель снова или просто добавить файлы сами? Как мы можем указать, что Dog должен наследовать от Animal, если мы используем rails Generate Model ?

Я думаю, что если мы будем использовать rails Generate Model вместо того, чтобы добавлять файлы модели самостоятельно, будет Файлы модульного тестирования и файлы фикстур, созданные для нас. Файл миграции также добавляется, за исключением случаев, когда он использует MongoDB, тогда файл миграции не будет.

7
задан XåpplI'-I0llwlg'I - 22 June 2013 в 07:34
поделиться

2 ответа

Если Собака, Кошка и другие подклассы, которые вы планируете, не собираются отклоняться от модели Животных, вы можете 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
6
ответ дан 7 December 2019 в 03:09
поделиться

Насколько мне известно, при создании модели нельзя указать суперкласс. Однако генераторы — это только ступенька к созданию ваших классов. Вы можете сгенерировать класс модели как обычно и просто изменить суперкласс в сгенерированном файле модели. Нет других мест, где должны быть указаны отношения наследования для работы сгенерированных файлов (например, фикстуры и модульные тесты не определяют супер- или подклассы).

Итак:

script/generate model Dog

Затем измените:

class Dog < ActiveRecord::Base

на:

class Dog < Animal

Если вы хотите сгенерировать модель, которая будет наследовать от Animal с использованием наследования одной таблицы, вы можете указать --skip-migrations в скрипте/ сгенерировать вызов (хотя вы можете захотеть, чтобы миграция добавила, например, столбцы, относящиеся к собакам, в таблицу животных, и вам нужно будет добавить столбец типа строки типа в таблицу животных).

3
ответ дан 7 December 2019 в 03:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: