Построение материализованного просмотра или использование ActiveRecord для моделей polymorphi c Rails - PullRequest
2 голосов
/ 29 февраля 2020

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...