Rails 3急切加载深层嵌套关联

时间:2013-06-11 11:27:35

标签: ruby-on-rails ruby-on-rails-3 activerecord eager-loading

我正在构建一个包含以下内容的公共活动流:

  1. 用户发布在3分钟前
  2. 用户主演帖子
  3. 我正在使用public_activity gem来实现这一目标。

    我的问题是,是否有办法将includes用于多态函数。

    我目前正在运行的代码如下:

    #app/models/post.rb
    
    class Post < ActiveRecord::Base
    
        include PublicActivity::Common
    
        attr_accessible :content, :visibility
    
        validates_presence_of :content
    
        belongs_to :postable, :polymorphic => true
        has_many     :stars
    
    end
    
    #app/models/star.rb
    class Star < ActiveRecord::Base
    
      include PublicActivity::Common
    
      validate :duplicate_star
    
          belongs_to :user
      belongs_to :post
    
    private
        def duplicate_star
     errors.add(:base, "Post already starred") if Star.exists?(:user_id => self.user, :post_id => self.post)
       end
    
    end
    
    
    #app/controllers/users_controller.rb
    class UsersController < ApplicationController
      def index
        @post = Post.new
        @activities = PublicActivity::Activity.order("id desc").all.includes(:trackable, :owner)
      end
    end
    

    可追踪者可以是帖子或明星。 我有渲染功能来显示两者。 问题是,如果我尝试输出类似{user} starred {postcontent}的内容,它会这样做:

    activity.trackable.post.content
    

    因此,每次查找帖子时都会导致多个查询。 我该如何解决这个问题/情况?

    提前致谢。

1 个答案:

答案 0 :(得分:3)

您是否无法使用标准的预先加载语法?

@activities = PublicActivity::Activity.order("id desc").includes(:owner, :trackable => {:post => :content})