Рельсы включают в себя, где условие - PullRequest
0 голосов
/ 15 мая 2018

У меня есть две модели:

user.rb

class User < ApplicationRecord
  has_many :orders, inverse_of: :user, dependent: :restrict_with_exception
end

order.rb

class Order < ApplicationRecord
  belongs_to :user, inverse_of: :orders
end

Я использую includes с where следующим образом:

User.where(id: selected_salesmen.pluck(:id))
    .includes(:orders)
    .where("order.booked_at > ? AND order.booked_at < ?", 
           booked_at_gteq, 
           booked_at_lteq)

Однако, это не дает мне необходимых users с orders.Любое объяснение, почему это не работает?

1 Ответ

0 голосов
/ 15 мая 2018

Это может привести к путанице между методами includes и joins, которые имеют смежные, но очень разные значения.

  • includes будет загружать связанные записи, что впоследствии предотвращает множественные вызовы базы данных. В основном используется для настройки производительности.
  • joins будет включать соединение с соответствующей таблицей в запрос к базе данных, что позволяет вам строить условия на основе связанной модели.

Обратите внимание, что для использования объединений необходимо ссылаться на имя таблицы, а не на имя отношения. По умолчанию ActiveRecord подключается к таблице, которая является множественным именем модели.

Итак, изменение включает в себя объединения и «заказ» на «заказы»:

User.where(id: selected_salesmen.pluck(:id))
    .joins(:orders)
    .where(
      "orders.booked_at > ? AND orders.booked_at < ?", 
      booked_at_gteq, 
      booked_at_lteq
    )

Вы также можете проверить, что selected_salesmen.pluck(:id) также возвращает некоторые идентификаторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...