Вопрос о рельсах один-ко-многим - PullRequest
0 голосов
/ 01 сентября 2011

Мне кажется, что я упускаю что-то очевидное здесь, так что, надеюсь, кто-то может мне помочь.

Допустим, у меня есть 3 модели: Здания, Полки и Книги.

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

Базовая структура будет выглядеть следующим образом:

class Building
  has_many :shelves
end

class Shelf
  has_many :books
  belongs_to :building
end

class Book
  belongs_to :shelf
end

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

Shelf.joins(:books).where("books.id is NULL").where(:building_id => building_id)<other_conditions...>

Однако этот запрос недавая мне результаты, которые я ожидаю (это не возвращает никаких полок, когда я знаю, что некоторые пусты).Я надеялся, что объединение заполнит NULL для столбца books.id для полки без книг, но, похоже, я ошибаюсь.

Есть ли другой способ сделать это, или я упускаю что-то простое?Спасибо за помощь!

1 Ответ

1 голос
/ 01 сентября 2011

Попробуйте выполнить тот же запрос с includes вместо joins.

books.id никогда не может быть NULL, поскольку вы запросили книги, принадлежащие полкам.joins даст вам только записи, для которых установлена ​​связь, поэтому вы запрашиваете книги, идентификаторы которых NULL и NOT NULL.

Этот ответ может пролить свет на различия между двумя методами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...