假设我们有这些模型
class Message belongs_to :messageable,polymorphic: true end class Ticket has_many :messages,as: :messageable has_many :comments end class User has_many :messages,as: :messageable has_many :ratings end class Rating belongs_to :user end class Comment belongs_to :ticket end
现在我想加载所有的邮件(有相关的门票或用户)和热门的负载取决于类的类型,对用户的票和评价的评论
当然Message.includes(:messageable).order(“created_at desc”)将只包括直接关联的对象,但问题是如何包括从每个模型类型派生的不同的关联类型(即在这个例子中,如何以热门的方式加载用户的票证和评分)?
解决方法
我可以想到的唯一方式是使用通用名称复制每个模型上的关联:
class Ticket has_many :messages,as: :messageable has_many :comments has_many :messageable_includes,class_name: "Comment" end class User has_many :messages,as: :messageable has_many :ratings has_many :messageable_includes,class_name: "Rating" end Message.includes(:messageable => :messageable_includes) ...
我不知道我会用这个策略作为一个广泛的解决方案,但如果这是一个复杂的,你的情况下,它可能适用于你.