Rails包含where条件

时间:2018-05-15 05:35:56

标签: sql ruby-on-rails

我有两种模式:

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 :(得分:1)

这可能会在方法includesjoins之间产生一些混淆,这些方法具有相关但却截然不同的含义。

  • 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)是否也会返回一些ID。