代码之家  ›  专栏  ›  技术社区  ›  user3574603

Rails 5/ActiveRecord:在不声明关联的情况下计算另一个表中的记录时,可以避免N+1吗?

  •  1
  • user3574603  · 技术社区  · 6 年前

    我有一个模型,它返回与给定值匹配的非关联模型中的记录数:

      def number_of_orders
        Order.where(delivery_date: date).size
      end
    

    我的模型有一个 date 属性,我想找到所有具有匹配日期的订单。

    我的控制器如下所示:

    def index
      @schedule_dates = ScheduleDate.where(date: 1.week.ago..Float::INFINITY)
    end
    

    我的问题是当我打电话的时候 number_of_orders 在视图中,我最终得到了N+1个查询:

    <% @schedule_dates.each do |date| %>
      <tr>
        <td><%= date.number_of_orders %></td>
    

    我试过了 includes 在控制器中:

    def index
      @schedule_dates = ScheduleDate.where(date: 1.week.ago..Float::INFINITY).includes(:orders)
    end
    

    但Rails抱怨说,没有找到该协会。

    在不与这两个模型建立关联的情况下,是否可以避免N+1查询?

    0 回复  |  直到 6 年前
        1
  •  0
  •   PGill    6 年前

    你可以加上 has_many 联想到 ScheduleDate

    has_many :orders, foreign_key: 'delivery_date', primary_key: 'date'

    然后你可以使用 includes 在搜索查询中

    @schedule_dates = ScheduleDate.includes(:orders).where(date: 1.week.ago..Float::INFINITY)

    在视野中

    <% @schedule_dates.each do |date| %>
      <tr>
        <td><%= date.orders.length %></td>
    
    推荐文章