SailsJS v0.10 Модель поиска по многим ассоциациям

Мне нравятся новые отношения Sails в версии 0.10, но моя самая большая проблема в настоящее время — это поиск моделей по их ассоциациям. Если бы мне пришлось заполнить ассоциацию вручную, скажем, массивом идентификаторов, это было бы довольно просто. Однако я не могу найти правильный способ обработки поиска с ассоциацией Sails.

Я предоставил пример кода, который описывает две модели: Company и User. Компании могут иметь много Пользователей, а Пользователь может иметь только одну Компанию. Это довольно прямое отношение «один ко многим», и цель состоит в том, чтобы найти все компании, которые соответствуют идентификатору пользователя.

## Company.js
name:
  type: 'string'
  required: true

users:
  collection: 'User'
  via: 'company'


## User.js
company:
  model: 'Company'
  required: true

last_name:
  type: 'string'
  required: true

first_name:
  type: 'string'
  required: true


## Lookup Users by Company ID of '2'
User.find(where: company: 2).exec(console.log)

# Result
# [] - Array of users matching that company ID


## ---- The Problem / Question ----
## Lookup Companies by User ID '1'
Company.find(where: users: contains: 1).exec(console.log)

# Result
# Error (E_UNKNOWN) :: Encountered an unexpected error:
# error: column company.users does not exist
# Details:
# { error: 'E_UNKNOWN',
#   summary: 'Encountered an unexpected error',
#   status: 500,
#   raw: 'error: column company.users does not exist' }

Я был бы признателен за любые мысли о том, как лучше всего справиться с этим поиском!


person mbmufffin    schedule 24.05.2014    source источник
comment
Похоже, ваши модели определены неправильно: beta.sailsjs.org/#/documentation/reference /Модели   -  person Robin    schedule 25.05.2014
comment
Да, это то же самое сообщение, что и когда атрибут буквально не существует.   -  person mbmufffin    schedule 26.05.2014


Ответы (1)


В случае запроса «все компании, чей список пользователей содержит # 1», вы пытаетесь выполнить подзапрос, который Waterline в настоящее время не поддерживает. Кроме того, это немного глупый пример, поскольку у каждого пользователя может быть только одна компания, поэтому вы всегда должны ожидать только одного результата. В любом случае правильным методом будет просто найти пользователя №1 и заполнить его компанию:

User.findOne(1).populate('company').exec(function(err, user) {
    console.log(user.company);
});

Я оставлю это вам, чтобы перевести это на Coffeescript;)

Чтобы найти всех пользователей компании, вы должны сделать что-то подобное:

Company.findOne(123).populate('users').exec(...)

Вы можете фильтровать заполненные результаты, но это не то же самое, что подзапрос:

Company.findOne(123).populate('users', {where: {id: [1,2,3]}}).exec(...)

Таким образом вы получите компанию №123 и заполните ее массив users только пользователями со значениями идентификатора 1, 2 или 3.

person sgress454    schedule 26.05.2014
comment
Спасибо, Скотт. В итоге я продвинулся вперед с решением в соответствии с тем, что вы упомянули первым, с поиском отфильтрованного типа модели, а затем с заполнением целевой модели. - person mbmufffin; 27.05.2014