2017-02-20 5 views
0

У меня есть таблица соединений, созданная из 2 других таблиц.Распечатайте то, что нет в таблице соединений

Say одна модель называется кошка, другой называется запрос, а таблица присоединиться называется catrequest (эта таблица будет иметь cat_id и REQUEST_ID)

Как бы напечатать все кошки не пересекались в соединительной таблице т.е. все кошки НЕ запрошены с использованием рельсов. Я видел ответы на основе БД, но я ищу решение для рельсов с использованием кода ruby.

Я понимаю, как печатать кошку, которая принадлежит к запросу т.е .:

<% @requests.each do |request| %> 
    <% request.cats.each do |cat| %> 
    <%= cat.name %> 
<% end %> 

, но я не понимаю, как сделать обратное этому.

ответ

4

Чтобы получить список кошек, которые никогда не были запрошены вы бы с:

Cat.includes(:cat_requests).where(cat_requests: { id: nil }) 
# or, if `cat_requests` table does not have primary key (id): 
Cat.includes(:cat_requests).where(cat_requests: { cat_id: nil }) 

выше предполагающей у вас есть соответствующие ассоциации:

class Cat 
    has_many :cat_requests 
end 
+0

В OP упоминается, что он работает с таблицей соединений в дополнение к таблицам кошек и запросов. Будет ли это работать? – jaydel

+0

@jaydel да это будет :) –

+0

Это решение также должно быть реализовано * снаружи * вида – whodini9

2

Это звучит как то, что вам нужно является внешним соединением, а затем вырезать строки кошек, которые не имеют соответствующих данных для запросов? Если это так, вы можете подумать об использовании Arel. Он поддерживает внешнее соединение и, вероятно, может использоваться для получения того, что вы ищете. Вот ссылка на руководство, которое имеет много полезной информации о Arel:

http://jpospisil.com/2014/06/16/the-definitive-guide-to-arel-the-sql-manager-for-ruby.html

Поиск страницы для «Чем больше, тем лучше» раздел, который где присоединяется обсуждаются.

+1

, хотя я считаю, что мой ответ по-прежнему действителен, ответ Андрея ниже, безусловно, лучший. – jaydel

Смежные вопросы