Предположим, я создаю модель с простыми характеристиками:(Rails) Как обойти нулевые поля STI?
class CreateWingedThings < ActiveRecord::Migration
create_table :winged_things do
t.integer :number_of_wings
t.integer :species
t.integer :air_speed_velocity
t.boolean :laden, :default => false
end
end
Но теперь я хочу два конкретных типов WingedThing
, со своими собственными отличными характеристиками:
class CreateBats < ActiveRecord::Migration
create_table :bats do
t.integer :echolocation_volume
t.string :snout_type
end
end
class CreateBirds < ActiveRecord::Migration
create_table :birds do
t.string :beak_size
t.integer :number_of_feathers
end
end
Это достаточно простая вещь, чтобы сделать с STI - Иметь Bat
и Bird
наследуют от WingedThing
:
class Bat < WingedThing
(Бонусный вопрос: как это выглядит в БД? У меня есть строка WingedThing
, сгенерированная для каждого Bat
и за каждые Bird
? Это мое понимание, но, пожалуйста, поправьте меня, если я ошибаюсь.)
(После этого возможно ошибочное понимание) Но что, если бы я хотел, скажем, FlightlessBird
? air_speed_velocity
было бы бессмысленным полем, и было бы неэтично обременять его; все экземпляры FlightlessBird
будут содержать нулевые записи для laden
и для air_speed_velocity
в строках DB, сгенерированных для соответствующего WingedThing
. Это больше данных, чем мне нужно, и не поддается масштабируемости, но я также не хочу полностью удалять поля, так как от них зависят как минимум две другие модели.
Т.Л., д-р Я хотел бы быть в состоянии сделать, это Bird
и Bat
быть в состоянии получить доступ к характеристикам, общие для обоих, в то время как имеющие FlightlessBird
имеют некоторые характеристики одного и того же родительской таблицы, но без создания нулевые поля в базе данных.
Каков наилучший способ моделирования таких отношений, чтобы убедиться, что я получу самую тонкую БД?
Почему миграция наследуется от 'ActiveRecord :: Base', а не от' ActiveRecord :: Migration'? – mdesantis
Хороший вопрос. Исправлена. – Vardarac