У меня есть контакт и лидерство. Они полностью две независимые модели. У меня есть страница потенциальных клиентов, где я могу делать запросы по потенциальным клиентам, сортировать по потенциальным предложениям и выполнять другую работу над потенциальными клиентами. Кроме того, контакт может быть создан без свинца. Однако контакт может 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')
У меня нет других идей. Могу ли я получить представление о моей проблеме здесь?