繁体   English   中英

如何在rails中优化多态新闻源?

[英]How do I optimize a polymorphic news feed in rails?

这是我的模型:

class User < ActiveRecord::Base
  has_many :activities
  has_many :requests

class Activity < ActiveRecord::Base
  belongs_to :user
  belongs_to :object, :polymorphic => true

我希望获得所有用户活动并显示它们

Activity.where(:user_id => current_user.id).include(:object)

问题是我不能急于加载对象模型,因为它是多态的我如何克服这个问题?

多态关联支持急切加载。 您需要执行以下操作:

Activity.find(:all, :include => :objectable, :conditions => {:user_id => current_user.id})

虽然您需要确保已在关联模型上正确定义了多态关系。

如需进一步帮助,请参阅: http//api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Eager+loading+of+associations

多态部分位于“Eager loading of Associations”部分的末尾。

正如@Wahaj所说,急切加载仅适用于:includes而不是:join

以下是文档的解释:

Address.find(:all,:include =>:addressable)

这将执行一个查询以加载地址并加载可寻址的每个可寻址类型一个查询。 例如,如果所有可寻址者都是Person或Company类,那么将执行总共3个查询。 要加载的可寻址类型列表是在加载的地址的背面确定的。 如果Active Record必须回退到先前的eager加载实现,并且将引发ActiveRecord :: EagerLoadPolymorphicError,则不支持此操作。 原因是父模型的类型是列值,因此其对应的表名不能放在该查询的FROM / JOIN子句中。

我想这就是你所追求的:

current_user.activities.includes(:object)

正如文档所说,每个关联都会有一个额外的查询。 我不确定,但您可能需要为rails指定另一个方向的关联,以了解要搜索的AR模型,例如:

class Post < ActiveRecord::Base
  has_many :activities, :as => :object
end

如果您仍然遇到错误,那么您可能会使用尚未实现此功能的早期rails版本。

它不可能对多态关系进行急切加载......但你可以为一个多态类型做这样的事情,比如你有两个polymorphic_type然后过滤那个类型的记录,然后急切加载它会工作然后....完美的渴望加载,但部分渴望加载

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM