#mysql #ruby-on-rails
#mysql #ruby-on-rails
Вопрос:
В rails, как я могу создать следующий запрос в rails? Я знаю, как написать это на SQL. Я хотел бы знать, возможно ли это с использованием rails.
Следующий код:
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
Как я могу заставить rails создать подобный запрос:
ВЫБЕРИТЕ clients
.* ИЗ clients
INNER JOIN users
НА users
. id
= clients
. user_id
INNER JOIN carts
НА carts
. user_id
= users
. id
INNER JOIN cart_items
НА cart_items
. cart_id
= carts
. id
ГДЕ (cart_items.created_at > ‘2019-03-31 04:00:00.000000’ И cart_items.введите (‘SavedItem’,’CartItem’)) ГРУППИРОВАТЬ ПО clients.user_id
Ответ №1:
Я не совсем уверен, почему вы хотите, чтобы во второй части было OR, но вы можете написать запрос join так, как хотите:
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')
Комментарии:
1. извините за это, я обновил код для запроса, которого я пытаюсь достичь.