Я работаю над существующим приложением, структура которого (упрощенно и) описана ниже. Один из наших новых запросов - найти всю деятельность в компании, которая довольно сложна и неэффективна для построения. Кажется, трудно написать запрос в ActiveRecord, поэтому я пытаюсь использовать Sceni c и создать материализованное представление, поскольку этот запрос будет в основном только для чтения.
Итак, у нас есть 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 для генерации представления, поэтому я изо всех сил пытался создать такое материализованное представление с полиморфными отношениями c, и если это вообще возможно / рекомендуется
Здесь вот что у меня есть:
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
Любая помощь здесь очень ценится!