2017-02-11 1 views
0

У меня есть этот SQL-запрос:SQL с пунктом в рельсах

WITH excluded_authors as 
    (SELECT author_id from authors_books) 
SELECT authors.* from authors 
    WHERE authors.id not in 
    (SELECT author_id FROM excluded_authors) 

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

Как сформулировать этот запрос в рельсах (кроме копирования его в find_by_sql

EDIT

Я попытался это:

Author.where.not("\"authors\".\"id\" in \"authors_bilios\".\"authors_id\"") 
+0

Я попробовал 'find_by_sql', который работает и и' where.not', который не работает. 'find_by_sql', возможно, не самый удовлетворительный способ сделать это. Именно поэтому вы отказались от вопроса? – thiebo

+0

В stackoverflow ожидается, что вы покажете, что вы уже пробовали, а затем попросите о помощи. Таким образом, вы получите гораздо лучшую помощь. – Iceman

+1

Ты абсолютно прав. Я редактировал свой вопрос, чтобы показать, что я сделал. У меня что-то работает, но просто интересно, есть ли лучший способ. – thiebo

ответ

1

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

author_ids = AuthorsBooks.pluck(:author_id) 
@authors = Author.where('id not in (?)', author_ids) 

Edit: Вы можете избежать двойного запроса с

@authors = Author.where('id not in (select author_id from authors_books)') 
+0

Спасибо. Там не будет тысяч строк, но сотни да. Я хотел избежать двойных запросов. Но я полагаю, что предложение 'with' является двойным запросом. – thiebo

+0

Ну, вы можете избежать двойного запроса, см. Мое редактирование. – Iceman

+1

И это быстрее! 'ActiveRecord: 10.3ms' для запроса с предложением' with' и 'ActiveRecord: 6.7ms' для вашего решения. – thiebo