【发布时间】:2014-02-25 11:27:35
【问题描述】:
我读到了这篇关于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
将 create_activities 定义为
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查询问题。
为了能够使用分页,解决这个问题的正确方法是什么?
【问题讨论】:
-
guests和tags是什么?请提供相关代码 -
@xlembouras 完成了,但我很确定你已经猜到它们是什么了
-
是的,我看不到
Event、Image、Guest和Tag是如何连接到Activity -
@xlembouras 完成并删除用户以简化
标签: ruby-on-rails performance activerecord polymorphic-associations