Создание материализованного представления или использование 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

Любая помощь здесь очень ценится!

0 ответов

Другие вопросы по тегам