Использование встраивания в дочернюю ассоциацию для улучшения производительности сортировки? - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть контакт и лидерство. Они полностью две независимые модели. У меня есть страница потенциальных клиентов, где я могу делать запросы по потенциальным клиентам, сортировать по потенциальным предложениям и выполнять другую работу над потенциальными клиентами. Кроме того, контакт может быть создан без свинца. Однако контакт может has_one привести. Поэтому я настроил свои модели так:

class Contact
  include Mongoid::Document
  has_one :lead

  field :reference_number
  field :some_date
end

class Lead
  include Mongoid::Document
  belongs_to :contact

  field :status
end

Вот проблема. На странице потенциальных клиентов я хочу отсортировать потенциальных клиентов по ссылочному номеру, который является атрибутом контакта. Поскольку контакт и лидерство являются независимыми моделями, я не могу встроить лидерство в контакт, потому что мне нужно самостоятельно запрашивать потенциальных клиентов. Так что embed_one НЕ является решением. Другой вариант, который я сначала попробовал, был сортировка с использованием ruby, но с более чем 10000 документов это было очень медленно и быстро исчезло как решение:

Lead.order_by( id: all.sort_by { |lead| lead.contact.reference_number }.map(&:id) )

Таким образом, единственное оставшееся решение - использовать какой-то тип кэша Сначала я попытался использовать хеш-поле, например:

class Lead
  ...
  field :denormalized_fields, type: Hash, default: {}

Но это тоже нехорошо, потому что я все еще не могу отсортировать по парам ключ / значение в хэше. Это не будет работать:

Lead.order_by(denormalized_fields['reference_number'] => 'asc')

Так что у меня есть только одна оставшаяся идея, но я не уверен, что это тоже хорошее решение. Я представляю новый документ под названием ParentAttribute:

class ParentAttribute
  include Mongoid::Document

  field :reference_number
end

class Contact
  include Mongoid::Document
  has_one :parent_attribute
  has_one :lead
end

class Lead
  include Mongoid::Document
  belongs_to :contact
  embeds_one :parent_attribute
end

Теперь, когда я создаю контакт, а не сохраняю поля в Контакте, я сохраняю его в ParentAttribute. И контакт будет по-прежнему вести has_one, но я также могу запросить атрибуты в руководстве:

Lead.order_by(:'parent_attributes.reference_number' => 'asc') 

У меня нет других идей. Могу ли я получить представление о моей проблеме здесь?

...