如何从我的Rails关联中删除N + 1个查询?

丁丁81

在我的Rails应用程序中,我具有以下关联:

class Person < ApplicationRecord

  has_many :payments

  def sales_volume(range)
    payments.in_range(range).sum(&:amount)
  end

  ...

end

class Payment < ApplicationRecord

  belongs_to :person

  def self.in_range(range)
    select { |x| range.cover?(x.date) }
  end

  ...

end

在我的控制器中,我正在做...

@people = Person.all.sort_by { |p| p.sales_volume(@range) }

...而且有效。

但是,不幸的是,它会生成很多N + 1查询

有没有一种方法可以显示每个销售量,person而无需为每个人生成单独的SQL查询?


加成:

我已经尝试过快速加载...

@people = Person.all.includes(:payments).sort_by { |p| p.sales_volume(@range) }

...但是那也不起作用。查询数量仍然相同。

安德烈·吉马良斯·萨卡塔(AndréGuimarãesSakata)

试试看:

@people = Person.all.includes(:payments).where(payments: { date: range }).sort_by { |p| p.payments.sum(&:amount) }

想法是将范围条件直接放入渴望的负载关联中,并更改求和的方式,以避免再次运行查询。

https://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-eager-loaded-associations

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

休眠执行N + 1个选择代替1-查询使用查询高速缓存时

Rails,如何避免关联中的总数(计数,大小,counter_cache)的“ N + 1”查询?

JPA @OneToOne选择具有N + 1个查询的列表

Ruby on Rails平均方法导致n + 1个查询

如何查询两个表,表1中的某些项与table2没有关联?

如何避免此代码的N + 1个查询

在1个查询中组合2个逻辑SQL语句

Sequelize:如何通过1:n关联查询模型,但在单个查询中包括所有关联的对象(PostgreSQL)

Mongo-将1个查询拆分为N个查询

设计对登录/注销用户执行n + 1个查询

1个查询中获取多个COUNT

在1个查询中查询3个表-错过最后一个

在MySQL中根据DATE()运行1个查询,而不是14个查询

如何从子查询中使mysql查询将2个结果合并为1个结果

我的查询应返回1时返回0个结果

避免Rails中的n + 1查询错误有很多关联

执行N + 1个查询的`map`

如何将2个查询与mysql合并为1个查询

具有has_many关联的Rails N + 1查询

Spring JPA + Hibernate OneToOne关系进行n + 1个查询

如何组合 2 个 sql 查询以获得 1 个结果

如何在 SQL Server 中只有 1 个查询

将 1 个表行中的多个 ID 查询到 1 个查询中的另一个表

MYSQL 查询包含 1 个查询中我需要的 2 个内容

Laravel 在 1 个查询中多次计数

在 1 个查询中从 2 个表中选择行

Laravel 查询在单个查询中加入 2 个表中的 1 个表

如何将 4 个查询合并为 1 个查询?(甲骨文SQL)

如何优化我的控制器,以便我运行 1 个查询而不是 3 个