Ruby on rails Rails-eager加载关联记录的数量,但不加载记录本身

Ruby on rails Rails-eager加载关联记录的数量,但不加载记录本身,ruby-on-rails,find,eager-loading,Ruby On Rails,Find,Eager Loading,我有一个页面需要很长时间才能呈现出来。有一半的时间(3秒)花在.find调用上,该调用包含一组急切加载的关联。我实际需要的只是在每种情况下显示在表中的关联记录的数量:我不需要实际记录本身。有没有办法直接加载计数?下面是一个简化的示例: @subjects = Subject.find(:all, :include => [:questions]) 在我的表格中,对于每一行(即每一主题),我只显示主题字段的值和每一主题相关问题的数量。我能否优化上述查找呼叫以满足这些要求 我曾考虑过使用一个

我有一个页面需要很长时间才能呈现出来。有一半的时间(3秒)花在.find调用上,该调用包含一组急切加载的关联。我实际需要的只是在每种情况下显示在表中的关联记录的数量:我不需要实际记录本身。有没有办法直接加载计数?下面是一个简化的示例:

@subjects = Subject.find(:all, :include => [:questions])
在我的表格中,对于每一行(即每一主题),我只显示主题字段的值和每一主题相关问题的数量。我能否优化上述查找呼叫以满足这些要求

我曾考虑过使用一个group字段,但我的完整调用包含了一些不同的关联,还有一些二阶关联,所以我认为groupby不起作用

@subjects = Subject.find(:all, :include => [{:questions => :tags}, {:quizzes => :tags}], :order => "subjects.name")
:本例中的标记是通过标记的二阶关联。这是我的联想,以防不清楚发生了什么

Subject
  has_many :questions
  has_many :quizzes

Question
  belongs_to :subject
  has_many :taggings
  has_many :tags, :through => :taggings

Quiz
  belongs_to :subject
  has_many :taggings
  has_many :tags, :through => :taggings

感谢您的建议-max

您可以为此实现计数器缓存。我在相册模型上维护了一个计数器,用于跟踪与它相关联的照片数量。我的过程看起来有点像这样(我相信我在某个博客上找到了这个方法,所以我不相信原始代码):

在照片模型上:

after_save :update_counter_caches
after_destroy :update_counter_caches

def update_counter_caches
  self.albums.each { |a| a.update_count } unless self.albums.empty?
end
在相册模型上:

def update_count
  update_attribute(:photographs_count, self.photographs.length)
end
您需要在相册上进行的迁移:

class AddCounterCacheColumnToModels < ActiveRecord::Migration
  def self.up
    add_column :albums, :photographs_count, :integer, :default => 0
  end

  def self.down
    remove_column :albums, :photographs_count
  end
end
class AddCounterCacheColumnToModels0
结束
def自动关闭
删除列:相册、照片\u计数
结束
结束
除非我误解了你的问题,否则这应该是实现你想要的目标的一种非常巧妙的方式。它在我当前的项目中运行良好。:)



编辑:请注意,我之所以使用此设置而不是默认的:counter_cache方法,是因为我需要为一个模型上的多个关联维护多个计数器。据我所知,使用计数器缓存无法实现这一点。

我认为最快的方法是:

@subjects = Subject.count(:joins => :questions, :select => 'DISTINCT(questions.id)')
我不确定是否有更复杂的查询(未测试):


我认为最好的方法是使用
:counter\u cache
上的
属于
关联

class Subject < ActiveRecord::Base
  has_many :questions
end

class Question < ActiveRecord::Base
  belongs_to :subject, :counter_cache => true
end
类主题true
结束
要使用
计数器\u缓存
,您还需要在
主题
表中添加
问题计数

发件人:

:计数器\u缓存
缓存所属对象的数量 通过使用关联类 计数器的增量和 减量计数器。计数器缓存 当此属性的对象 类是在 它被摧毁了[…]


这样做。这是一个比其他两个更好的解决方案。谢谢-计数器缓存在这种情况下是好的,因为它发生了,我已经同意了。不过,我仍然有兴趣得到我原来问题的答案。谢谢,这不是我想要的。我想要主题的所有字段以及每个主题相关问题的数量。这只是列出了所有主题的相关问题的总数(这与所有问题都有主题,因此与问题中的计数(*)相同)。一点也不,它将返回有主题的问题计数(在这种情况下,什么是真正相同的,但您可以将其与计数标记一起使用)
class Subject < ActiveRecord::Base
  has_many :questions
end

class Question < ActiveRecord::Base
  belongs_to :subject, :counter_cache => true
end