Mongoid, как сделать order_by через ассоциацию reference_one (и последующие ассоциации)? - PullRequest
4 голосов
/ 23 июня 2011

Простая модель:

class hat
  embedded_in :owner
  field :color
end

class owner
  embedds_one :hat
  referenced_in :house
  field :name
end

class house
  references_one :owner
  field :number
end

Проще говоря, у нас есть коллекция домов, связанных с владельцем, и у владельца может быть цветная шляпа.дом по их номеру:

House.all.order_by( [[ :number, :asc ]])

Но я хочу заказать дом по имени их владельца, в идеале я хотел бы написать:

House.all.order_by( [[ :'owner.name', :asc ]])

Но это такне работает ...

И еще, я хотел бы иметь возможность сортировать дома по цвету шляпы владельца.если возможно:)

Спасибо

ALex

Ответы [ 2 ]

3 голосов
/ 23 июня 2011

Точечная запись возможна только для встроенных документов, но у вас есть 2 коллекции - дома и владельцы.В одной из записей Владельца в MongoDB у вас есть только поле house_id, в одной из записей Дома вы не имеете никакого отношения к модели Владельца.Таким образом, единственный способ - извлечь все Дома и затем отсортировать достигнутую коллекцию, используя Enumerable # sort.

2 голосов
/ 23 июня 2011

способов сделать это будут: - вставить имя владельца в виде строки в документ дома. Домашний объект будет иметь как owner_id (так что вы можете получить полный документ владельца), так и дополнительное поле, содержащее только имя владельца в виде строки. Вам нужно только изменить имя при изменении owner_id, и это можно сделать в 1 обновлении, чтобы оно было согласованным. С его помощью это будет очень эффективный запрос, так как ему не нужно просматривать коллекции и документы для чтения. Нижняя сторона используется немного больше памяти.

  • имеет объект владельца, ссылающийся на дом, так как владелец "владеет". Затем вы можете запросить владельца, отсортированного по имени, а затем получить справочные документы, которые вы получите в правильном порядке. Недостатком является выполнение множества отдельных запросов.

  • одним из крайних решений является внедрение всех этих документов: шляпа внутри владельца, владелец внутри дома.

лучше, AG

...