Вложенные запросы с использованием Arel (Rails3)

Например, у меня есть 2 модели:

Покупка (принадлежит :users) Пользователь (имеет_много :purchases)

Я хочу выбрать всех пользователей, у которых есть хотя бы одна покупка.

В SQL я бы написал так:

SELECT * FROM `users` WHERE `id` IN (SELECT DISTINCT `buyer_id` FROM  `purchases`)

И еще один вопрос: есть ли полная документация или книга по Arel?


person Pavel Manylov    schedule 05.11.2010    source источник


Ответы (3)


Хм, я хотел бы ответить на свой вопрос... :)

buyers=purchases.project(:buyer_id).group(purchases[:buyer_id]) #<-- all buyers
busers=users.where(users[:id].in(buyers))  #<--answer
person Community    schedule 05.11.2010

В Rails Guide есть действительно хорошая документация по ARel.

http://guides.rubyonrails.org/active_record_querying.html#conditions

API Rails также весьма полезен для некоторых малопонятных опций. Я просто гуглю конкретный термин с «rails api», и он появляется первым.

person Nate Bird    schedule 05.11.2010

Я не верю, что приведенный выше код выдает вложенный запрос. Вместо этого кажется, что он выдаст 2 отдельных SQL-запроса. У вас может быть сравнимая скорость (в зависимости от того, насколько вы заинтересованы в производительности), но с двумя обращениями к серверу он не дает таких же преимуществ, как вложенные запросы.

person jman    schedule 03.10.2011