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