Выполните объединение двух моделей Rails, реализующих наследование одной таблицы - PullRequest
1 голос
/ 27 января 2020

У меня есть три модели, назовем их Product, TemplateProduct и ReadyProduct. Для них существует только одна таблица, таблица products, и обе TemplateProduct и ReadyProduct наследуются от модели Product. Между TemplateProduct и ReadyProduct существует связь has_many / own_to. Шаблоны используются для определения общих характеристик продуктов, а Readys - для настройки продуктов и того, что фактически доступно для просмотра клиенту. Каждый TemplateProduct имеет id, а каждый ReadyProduct имеет template_product_id, который связан с его шаблоном.

Проект построен с использованием Rails 5.

Кем я хочу быть можно собрать список TemplateProduct с, затем получить счетчик каждого шаблона, связанного с ReadyProduct с, и сделать это таким образом, чтобы не забивать базу данных. Я понимаю ассоциации ActiveRecord, но мой SQL слаб, и у меня есть только ограниченное понимание объединений. Я могу собрать список TemplateProduct с простым Product.where(conditions), но я не знаю, что, когда у меня есть это. Ради гибкости я хочу иметь возможность подсчитать ReadyProduct этого начального сбора, так как иногда мне понадобится дополнительный счет, а иногда нет. Я уверен, что должен быть простой способ сделать это, но я не нашел решения.

1 Ответ

3 голосов
/ 27 января 2020

Если вам просто нужно сопоставление TemplateProduct идентификаторов с ReadyProduct счетами, тогда все, что вам нужно:

TemplateProduct.joins(:ready_products).group(:id).count

Если вы хотите TemplateProduct экземпляров с запеченными в ReadyProduct счетах , тогда вам понадобится это:

tps = TemplateProduct.joins(:ready_products).select('products.*, COUNT(ready_products_products.id) ready_product_count').group(:id)

tps.first.ready_product_count
#=> 6

ready_products_products определяется Rails, перед ним ставится реальное имя таблицы (products) с "табличной формой" имени модели (множественное число, случай змеи) в нижнем регистре, ready_products), с подчеркиванием.

...