1

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

在我的控制器中,我有

def some_action
  @activities = user.activities
end

User课堂上,我有它has_many :activities

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

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。

4

1 回答 1

1

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

在我遍历所有@activities. 如果不是,我会向用户显示不同的内容。

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

@activities = user.activities.all

这可以防止 COUNT 调用并在构建视图之前加载所有记录。

于 2012-07-26T21:14:48.043 回答