神秘的SELECT COUNT(*)出现在我的控制器中,用于has_many关系

时间:2012-07-26 18:27:25

标签: ruby-on-rails-3 postgresql activerecord

当我开始在我的开发日志中看到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。

1 个答案:

答案 0 :(得分:1)

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

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

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

@activities = user.activities.all

在构造视图之前阻止COUNT调用并加载所有记录。