Как мне создать этот запрос, используя рельсы? - PullRequest
0 голосов
/ 01 апреля 2019

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

Следующий код:

one_day_ago = 1.days.ago.at_beginning_of_day;
Client.joins(:user => {:cart => [:cart_items, :saved_items]}).where('cart_items.created_at > ?', one_day_ago).group('clients.user_id')

Приведенный выше код создает следующий запрос:

SELECT `clients`.* FROM `clients` 
INNER JOIN `users` ON `users`.`id` = `clients`.`user_id` 
INNER JOIN `carts` ON `carts`.`user_id` = `users`.`id` 
INNER JOIN `cart_items` ON `cart_items`.`cart_id` = `carts`.`id` 
AND `cart_items`.`type` IN ('CartItem') 
INNER JOIN `cart_items` `saved_items_carts` ON `saved_items_carts`.`cart_id` = `carts`.`id` 
AND `saved_items_carts`.`type` IN ('SavedItem')
WHERE (cart_items.created_at > '2019-03-31 04:00:00.000000') GROUP BY clients.user_id

Как я могу получить рельсы для создания запроса, подобного этому:

ВЫБРАТЬ clients. * ОТ clients ВНУТРЕННЕЕ СОЕДИНЕНИЕ users ВКЛ users. id = clients. user_id INNER JOIN carts ON carts. user_id = users. id INNER JOIN cart_items ON cart_items. cart_id = carts. id ГДЕ (cart_items.created_at> '2019-03-31 04: 00: 00.000000' И cart_items.type IN ('SavedItem', 'CartItem')) GROUP BY clients.user_id

1 Ответ

1 голос
/ 01 апреля 2019

Я не совсем уверен, почему вы хотите, чтобы вторая часть имела ИЛИ, но вы можете написать запрос на объединение так, как хотите:

Client.joins(user: { cart: [:cart_items] }).joins("INNER JOIN cart_items saved_cart_items ON saved_cart_items.cart_id = carts.id OR saved_cart_items.type IN ('SavedItem')").where('cart_items.created_at > ?', one_day_ago).group('clients.user_id')

Проверьте, дает ли этот обновленный запрос желаемый результат:

Client
.joins(:user, :cart)
.joins('INNER JOIN cart_items ON cart_items.id = carts.id')
.where('cart_items.created_at > ?', one_day_ago)
.where(cart_items: { type: ['SavedItem', 'CartItem'] })
.group('clients.user_id')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...