ruby-on-rails-3 - 神秘的 SELECT COUNT(*) 出现在我的 Controller 中,用于 has_many 关系

标签 ruby-on-rails-3 postgresql activerecord

当我开始在我的开发日志中看到 SELECT COUNT(*) 调用时,我现在无法追踪,但它正在发生,而且似乎没有理由它。我想知道这是否正常和/或为什么会这样。我不认为这是一个主要问题,但如果我不需要它,为什么还要额外调用数据库。

在我的 Controller 中我有

def some_action
  @activities = user.activities
end

User 类中,我有 has_many :activities

当我调用这个 Action 时,我的日志输出是

User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
(0.3ms)  SELECT COUNT(*) FROM "activities" WHERE "activities"."user_id" = 1
Activity Load (0.3ms)  SELECT "activities".* FROM "activities" WHERE "activities"."user_id" = 1

我可以肯定地告诉您的是,它并没有用于执行 SELECT COUNT(*) 调用,而且据我所知,没有任何尝试来获取该计数。

我正在使用 Rails 3.2.6 和 PostgreSQL 9。

最佳答案

我发现计数查询的原因是 Rails 的延迟加载和我使用数据的顺序。

当我遍历所有 @activities 时,我对 View 模板中的实例变量做的第一件事是检查是否有任何要经过的。如果不是,我会向用户显示不同的内容。

@activities.empty? 正在执行计数并将其与 0 进行比较,这比将所有记录加载到数组中然后检查它更有效。我可以选择将我的操作更改为

@activities = user.activities.all

这会阻止 COUNT 调用并在构建 View 之前加载所有记录。

关于ruby-on-rails-3 - 神秘的 SELECT COUNT(*) 出现在我的 Controller 中,用于 has_many 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11675687/

相关文章:

css - Ruby on Rails 根据数据库更改 CSS 中的背景颜色

ruby - 如何重构构建事件记录搜索哈希的 Controller 操作

sql - 试图计算 PostgreSQL 中两个经纬度点之间的距离 - PostgreSQL earth_box(ll_to_earth) 返回值的单位是什么?

ruby-on-rails - 自定义函数后的rails事件记录has_many外键

ruby-on-rails - 如何跳过 Rails 中的 before_validations?

ruby-on-rails - RestClient 只用最后一个散列去掉散列参数数组?

ruby-on-rails - 在 Rails 中将日期格式化为单词

mysql - Rails 寻找 database.yml 未指定的数据库

postgresql - 在 PostgreSQL+Timescaledb 上使用索引的最佳方式

sql - 如何通过客户端库 (Postgres) 在 SQL 查询中将元组(不是数组)作为 WHERE 约束参数传递?