В Ruby on Rails, если мы сгенерировали модель «Animal» и теперь хотим иметь «Dog», как мы должны это сделать? - PullRequest
7 голосов
/ 01 сентября 2010

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

rails generate model animal name:string birthday:date

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

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

Ответы [ 2 ]

6 голосов
/ 01 сентября 2010

Если планируемые Dog, Cat и другие подклассы, которые вы планируете, не отклонятся от модели Animal, вы можете использовать здесь шаблон 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">

Для создания модели Dog

$ script/generate model Dog --skip-migration

И затем изменить (обычно app/models/dog.rb):

class Dog < ActiveRecord::Base

на

class Dog < Animal
3 голосов
/ 01 сентября 2010

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

Итак:

script/generate model Dog

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

class Dog < ActiveRecord::Base

на:

class Dog < Animal

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

...