Вы также могли бы написать что-то вроде:
Agency
has_many :owners
Owner
belongs_to :agency
has_many :properties
Property
belongs_to :owner
А затем добавить метод экземпляра в модели агентства:
def properties
owners.map(&:properties).flatten.uniq
end
Однако этот подход будет опрашивать базу данных для извлечения владельцев, а затем будет запрашивать вашу БД снова один раз для каждого владельца, чтобы получить свойства каждого владельца.
Надеюсь, это поможет.
EDIT
Существует еще одно решение, которое подразумевает только 2 запросов:
def properties
Property.where({:owner_id.in => owner_ids})
end
ПРОФИ:
Он использует только два запроса.
Он возвращает критерии Mongoid (предыдущее решение вернуло массив). Таким образом, вы можете цепи прицелы и так далее (т.е. my_agency.properties.sold #if вы определили продаваемый объем)
CONS:
Этот код кажется менее читаемым.
Кроме того, он менее ремонтопригодным. Если вы измените внешний ключ в отношении Owner-Property, вы должны обновить этот метод (Property.where ({: foreign_key ...}) или изменить способ, которым владелец имеет много свойств. Первый вариант все еще действует до тех пор, пока все свойства владельца можно найти с помощью метода экземпляра some_owner.properties.
Хорошо. Как вы думаете, будет ли соответствующая проблема с производительностью, как я это делаю? – jturolla
Да, если у вас есть большие коллекции, синхронизировать те, что has_many будет влиять на записи. Также помните, что Mongodb не имеет атомных транзакций для нескольких коллекций, поэтому у вас могут быть непоследовательные данные. –