如果您有一组小的预定义类型,这是执行此操作的一种方法
class Person < ActiveRecord::Base
has_many :type_1_posts, :class_name => 'Post', :conditions => 'post_type = 1'
has_many :type_2_posts, :class_name => 'Post', :conditions => 'post_type = 2'
has_many :type_3_posts, :class_name => 'Post', :conditions => 'post_type = 3'
end
然后您可以编写如下所示的代码来获取所有数据:
@all_people = Person.includes(:type_1_posts, :type_2_posts, :type_3_posts).all
帖子的急切加载允许每种类型的帖子的计数可用,以及每种类型的所有帖子。
如果您需要此代码的额外性能,因为您经常执行此查询,那么您可以考虑使用 Rails计数器缓存机制来跟踪 Person 对象上每种类型的计数。
Rails 的美妙之处在于,在使代码读取速度更快的过程中,您的主要显示代码不需要更改(添加计数器缓存会使添加/删除帖子的速度变慢,因此您可能不希望在所有情况下都这样做)。
- 编写初始代码
- 使用急切加载使其更快
- 使用计数器缓存使其更快