Как вы можете создать коллекцию ActiveRecord из двух отдельных таблиц без STI? - PullRequest
0 голосов
/ 25 мая 2018

У нас есть две модели, которые принадлежат компании: счета клиентов и поставщиков.В настоящее время они имеют свои собственные индексные страницы;создание коллекции для разбивки на страницы / сортировки на этих страницах так же просто, как current_company.customer_invoices.

class CustomerInvoice < ApplicationRecord
  belongs_to :company
end

class VendorInvoice < ApplicationRecord
  belongs_to :company
end

class Company < ApplicationRecord
  has_many :customer_invoices, -> { order(due_date: :desc) }
  has_many :vendor_invoices, -> { order(due_date: :desc) }
end

Теперь нам нужно создать общую страницу индекса, которая будет разбивать и сортировать счета обоих типов.STI кажется очевидным решением, но, поскольку они функционально ОЧЕНЬ отличаются, и имеют минимальное пересечение в своих столбцах схемы, это выглядит как неудачный вариант использования.Есть ли другой вариант, кроме загрузки всех записей и сортировки / разбивки на страницы в памяти?

class Company
  def invoices
    (customer_invoices + vendor_invoices)
  end
end

class InvoicesController < ApplicationController
  def index
    @invoices = current_company
                  .invoices
                  .sort_by(&:due_date)
                  .page(params[:whaveter_page])
  end
end

По мере роста количества счетов это будет иметь очень плохую производительность памяти :(.

1 Ответ

0 голосов
/ 25 мая 2018

Чтобы дать вам лучший ответ, вам нужно знать о структуре вашей базы данных, вариантах использования и т. Д.

Но вот два подхода, которые вы можете рассмотреть:

  1. Создайте отдельную таблицу, в которой будут храниться данные для обеих моделей.Такая таблица должна содержать только столбцы, необходимые для фильтрации, сортировки и отображения данных в объединенном списке.и, конечно же, ссылки на оригинальные строки в респектабельных таблицах.С такой таблицей это довольно просто, вы просто запрашиваете эту таблицу.Основным недостатком является то, что теперь вам нужно писать в две таблицы при создании или обновлении счета.Но создание комбинированного индекса будет очень быстрым.Технически вы можете переместить все индексы только в эту таблицу и выполнить другие оптимизации базы данных.

  2. Вы можете использовать оператор UNION и объединить результаты из обеих таблиц в одну.Вам нужно выбрать одинаковые столбцы из обеих таблиц с одинаковыми типами.Это будет медленнее, чем первое решение, но преимущество в том, что вам не нужно вести дополнительную таблицу.Он будет создан по запросу.Написание оператора объединения с активной записью может быть немного сложным

...