ruby-on-rails - Rails 3 急切加载深层嵌套关联

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

我正在构建一个公共(public)事件流,其中包含以下流:

  • 用户在 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} 加星标 {postcontent} 的内容,它会这样做:
    activity.trackable.post.content
    

    所以这会导致多次查询,每次它找到一个帖子。
    我该如何解决这个问题/情况?

    提前致谢。

    最佳答案

    您不能使用标准的急切加载语法吗?

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

    关于ruby-on-rails - Rails 3 急切加载深层嵌套关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17042965/

    相关文章:

    ruby-on-rails - 关联依赖于 Rails 中的数据库吗?

    javascript数组保存到rails数据库中

    ruby-on-rails - Rails 3 默认日期时间格式(不含 UTC)

    ruby-on-rails - 简单消息系统的当前对话逻辑

    ruby-on-rails - 与 Rails 3 站点的完整谷歌日历集成

    javascript - 如何编写 JavaScript 测试用例

    ruby-on-rails - 选择 rails 中具有最大列值的行

    ruby-on-rails - 找不到 Rails @import compass

    ruby-on-rails - 带有可选参数的 Rails Search?

    php - 如何在 yii2 ActiveRecord 中使用查询缓存