Создание материализованного представления или использование ActiveRecord для полиморфных моделей Rails
Я работаю над существующим приложением, структура которого (упрощенная и) описана ниже. Один из наших новых запросов - найти всю деятельность в компании, которую довольно сложно построить и которую неэффективно построить. Кажется сложно написать запрос в ActiveRecord, поэтому я пытаюсь использовать Scenic и построить материализованное представление, так как этот запрос будет в основном только для чтения.
Итак, у нас есть Person
, Group
, Project
, Report
, Update
а также ActivityReciept
вместе с некоторыми моделями соединения. Человек принадлежит к разным группам и разным проектам.
Моя цель - показать ленту групповой активности всех групп, в которые входит участник, поэтому я хочу получить эффективную Activity
по group
, вместе с author
информация, отсортированная по времени, и кажется, что материализованное представление со следующими столбцами сделает это возможным:
activity_receipt_id, group_id, person_id
class Person < ApplicationRecord
has_many :groups
has_many :projects
end
class Membership < ApplicationRecord
# id, group_id, person_id
belongs_to :group
belongs_to :person
end
class Company < ApplicationRecord
has_many :projects
has_many :people
end
class GroupDonation < ApplicationRecord
# id, group_id, project_id
belongs_to :group
belongs_to :project_id
end
class Project < ApplicationRecord
has_many :group_donations
has_many :people
end
class ActivityReceipt < ApplicationRecord
# polymorphic belongs_to relation to 'postable' which are reports, & updates
# so, it has id, postable_id, and postable_type as columns and then other specific metadata
belongs_to :postable
end
class Report < ApplicationRecord
# project_id, membership_id and other specific metadata
belongs_to :project
belongs_to :membership #to track the author
has_one :activity_receipt
end
class Update < ApplicationRecord
# project_id, membership_id and other specific metadata
belongs_to :project
belongs_to :membership #to track the author
has_one :activity_receipt
end
Концептуально запрос предназначен для всех заданных group_ids
, выберите связанные проекты, а затем связанные с ними отчеты и обновления, а затем квитанции об их активности, которые в конечном итоге понадобятся. Я не очень знаком с написанием SQL для генерации представления, поэтому я изо всех сил пытался сделать такое материализованное представление с полиморфными отношениями, и если это даже возможно / рекомендуется
Вот что у меня есть на данный момент:
SELECT groups.id AS group_id, people.id AS people_id, activity_receipts.id as activity_receipt_id
FROM groups
JOIN group_donations ON group_donations.group_id = groups.id
JOIN projects ON projects.id = group_donations.group_id
JOIN reports ON reports.project_id = project.id
JOIN updates ON updates.project_id = project.id
JOIN activity_receipts ON
// Stuck here
Любая помощь здесь очень ценится!