我读了这篇关于Using Polymorphism to Make a Better Activity Feed in Rails人的有趣文章.

我们最终会得到这样的结果

class Activity < ActiveRecord::Base
  belongs_to :subject, polymorphic: true
end

现在,如果其中两个主题是:

class Event < ActiveRecord::Base
  has_many :guests
  after_create :create_activities
  has_one :activity, as: :subject, dependent: :destroy 
end

class Image < ActiveRecord::Base
  has_many :tags
  after_create :create_activities
  has_one :activity, as: :subject, dependent: :destroy 
end

创建_活动定义为

def create_activities
  Activity.create(subject: self)
end

客人和标签的定义如下:

class Guest < ActiveRecord::Base
  belongs_to :event
end

class Tag < ActiveRecord::Base
  belongs_to :image
end

如果我们查询最近记录的20项活动,我们可以:

Activity.order(created_at: :desc).limit(20)

我们有一个可以解决的第一个N+1查询问题:

Activity.includes(:subject).order(created_at: :desc).limit(20)

但是,当我们呼叫来宾或标签时,我们还有另一个N+1查询问题.

What's the proper way to solve that in order to be able to use pagination ?

推荐答案

这有望在rails 5.0中得到修复.已经有一个问题和一个请求.

https://github.com/rails/rails/pull/17479

https://github.com/rails/rails/issues/8005

我已经Forking 了轨道,并将补丁应用到4.2-stable上,它对我很有效.请随意使用我的fork ,尽管我不能保证定期与upstream 同步.

https://github.com/ttosch/rails/tree/4-2-stable

Ruby-on-rails相关问答推荐

如何在_serialize之前执行代码?""或者如何在序列化属性之前对属性进行清理?

`ActionController::API` 祖先类在加载后不会更新

升级到 Rails 6.1.6.1 导致 Psych::DisallowedClass: 试图加载未指定的类:符号

错误原始错误:未安装 ImageMagick/GraphicsMagick

如何在我的 rails 应用程序中测试 ActiveRecord::RecordNotFound?

耙路由错误缺少:路由定义上的操作键

如何在终端中查看 Heroku 应用程序的当前数据库架构?

Rails:删除级联与依赖销毁

rails 模型 has_many 本身

如何在 Rails 上生成 AuthenticityToken

HABTM 关系 - 如何根据关联模型的属性找到记录

Rails 4网站图标问题

是否有与 PHP 的 isset() 等效的 Rails?

将根 url 重定向到 Rails 应用程序中的其他位置

Rails:如何在表单的必填字段上禁用星号?

警告:引用了顶级常量

反编译开发assets资源 管道

Rails,Docker:主机不存在:默认

简单的 rails rake 任务拒绝运行并出现错误不知道如何构建任务,为什么?

为什么 Mac OS X 带有 ruby​​/rails?