Запрос на несуществующую запись habtm - PullRequest
0 голосов
/ 27 декабря 2011

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

Project.includes(:assets).where("assets.id != ?", asset.id)

каков правильный запрос?

1 Ответ

0 голосов
/ 27 декабря 2011

Если вы хотите найти все проекты, не связанные с конкретным активом, что-то вроде этого должно работать (это не проверено, поэтому отрегулируйте по мере необходимости):

Project.joins(:assets_projects).where("assets_projects.asset_id != ?", asset_id)

asset_id - это id вашего экземпляра Актива.

Кроме того, вы не должны циклически просматривать активы, чтобы найти все проекты, связанные с текущим активом итерации, что означало бы слишком большое количество обращений к базе данных (это так называемая проблема N + 1 - хорошее объяснение можно найти, например, здесь ). Чтобы найти все проекты, не связанные с каким-либо активом, одним запросом, выполните следующие действия:

Project.find_by_sql(%(
  SELECT * FROM projects
  WHERE NOT EXISTS (SELECT * FROM assets_projects WHERE assets_projects.project_id = projects.id)
))
...