Вкратце - нет никакого чистого чистого STI API для того, чего вы пытаетесь достичь на данный момент.
Я посмотрел на самом деле в это а около года назад, и пришли к выводу, что это не очень хорошая идея по нескольким причинам:
- Если вы хотите использовать PostgreSQL специфические особенности - вы, в основном женившись себя к этой БД. Не поймите меня неправильно. PostgreSQL - отличная БД, и я использовал ее в ряде случаев, но вы собираетесь придерживаться этого проекта БД и приложений.
- Скорее всего, если вы начнете использовать конкретные функции БД, вы либо закончите их реализацию вручную (запустив какие-то команды в БД или используя графический интерфейс), либо напишите какой-то скрипт, который вам придется вызывать, когда вы запускаете db: migrate (вам нужно будет сделать это, если вы хотите провести надлежащее тестирование). Через некоторое время это становится громоздким и раздражающим.
- Если вы обнаружите, что все больше и больше раздражает, процитировать вас «больно широкие столы и„типа“столбцы» затем:
- Ваша конструкция стола должна быть переосмыслена и переделана
- Ваши модели могут не быть хорошими кандидатами для STI
- Вам просто нужно жить с ним.
Большинство ИТ-проблемы на самом деле сводятся к следующему: усилию против Benefit.
В вашем случае вы должны задать себе этот вопрос:
- Сколько времени вы хотите потратить на реализацию более STI структуру, если это только ускорит ваш необработанный запрос SQL на несколько секунд ? Может быть, лучше написать более эксплицирующий SQL-запрос? Большинство приложений не растут до размера, где это действительно становится проблемой. Но это может быть и другое в вашем случае.
PS:
Также быстрый отзыв по структурированию STI в вашем приложении: Если вы обнаружите, что у вас есть много моделей, которые используют STI как ProductCategory, CommentCategory, PhoneCategory, ClientCategory что все унаследует от Cateogory - я стараюсь организовывать их в папках внутри каталога моделей. Тогда в application.rb просто добавьте строку: config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/**}')]
«Значит, мы все знаем, что STI (однонаправленное наследование) является риторическим, потому что это приводит к загроможденной модели данных и субоптимальной базе данных». --- Я не принимаю это предположение. –
Хорошо, может быть, это немного обобщение. Но это, как правило, хорошая идея, когда у ваших моделей-мам нет большого количества свойств, которые не относятся к другим детям. В противном случае вы получите широкие широкие таблицы столбцы с нулевым значением. Может быть, все в порядке с точки зрения рельсов, но может получить отвратительный при запуске сырой SQL в базе данных, возможно, наследование PostgreSQL не будет быстрее, но, по крайней мере, оно скрывает все это от меня! : P –
Поскольку наследование Postgres накладывается так легко, я не думаю, что просто наличие столбца типа будет достаточно хорошим? Из того, что я видел с наследованием, 'SELECT *' будет возвращать все связанные столбцы (и, я думаю, все непривязанные столбцы тоже:/... Но ваша структура БД была бы чище. – stuartc