【问题标题】:Rails 3 eager loading of deep nested associationRails 3 急切加载深层嵌套关联
【发布时间】:2013-06-11 11:27:34
【问题描述】:

我正在构建一个公共活动流,其中包含以下流:

  1. 用户在 3 分钟前发布
  2. 用户为帖子加了星标

我正在使用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

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

activity.trackable.post.content

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • trackable 也可能包含另一个多态类类型,其中可能没有 :content 作为属性。
    猜你喜欢
    • 1970-01-01
    • 2018-07-28
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多