Rails 5 LEFT OUTER JOIN включает записи вне условия - PullRequest
0 голосов
/ 03 января 2019

Это сводит меня с ума, и я бы хотел увидеть на это отдельную пару глаз.У меня есть следующие модели:

class Client
  has_many: client_orders
end

class ClientOrders
  belongs_to :client
end

Сейчас я пытаюсь получать заказы только для клиентов, созданных за последние 30 дней.Поэтому я пишу это:

time_range = (30.days.ago - 1.day)..Time.now.midnight
@clients = Client.left_outer_joins(:client_orders).where( client_orders: { created_at: time_range } )

Я чувствую, что логика верна.Теперь происходит следующее:

Я пишу: @clients.first.client_orders.first

И самая первая запись такова:

=> #<ClientOrder:0x00007f364764b3b8
 id: 1,
 client_order_number: "25970",
 status: "pending",
 client_id: 3,
 client_user_id: 8,
 shipping_cost_cents: 287,
 shipping_cost_currency: "USD",
 taxes_cents: 8800,
 taxes_currency: "USD",
 created_at: Fri, 16 Feb 2018 00:00:00 UTC +00:00,
 updated_at: Mon, 31 Dec 2018 21:51:54 UTC +00:00,
 subtotal_cents: 3426500,
 subtotal_currency: "USD",
 quickbooks_id: nil,
 sync_token: nil,
 convenience_fee_cents: 0,
 convenience_fee_currency: "USD">

Обратите внимание на дату created_at?Теперь, что действительно смешно, если я сделаю это:

@clients.first.client_orders.first.created_at === time_range
D, [2019-01-03T06:28:53.885281 #1] DEBUG -- :   CACHE ClientOrder Load (0.0ms)  SELECT  "client_orders".* FROM "client_orders" WHERE "client_orders"."client_id" = $1 ORDER BY "client_orders"."id" ASC LIMIT $2  [["client_id", 3], ["LIMIT", 1]]
D, [2019-01-03T06:28:53.886633 #1] DEBUG -- :   ↳ (pry):7
=> false

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

Итак, да, моя цель - получить объект, который содержит заказы только за последние 30 дней.

БОНУСНЫЕ ТОЧКИ: получите клиентов, у которых нет заказов за последние 30 дней,Это я не совсем уверен, как осуществить.Я думал что-то вроде этого: @clients = Client.where('id NOT IN (SELECT DISTINCT(client_id) FROM client_orders)')

1 Ответ

0 голосов
/ 03 января 2019

enter image description here Я думаю, вы должны объявить что-то вроде этого

time_range = (Time.now.midnight - 30.days)..Time.now.midnight
@clients = Client.left_outer_joins(:client_orders).where( client_orders: { created_at: time_range } )
...