首页 > 解决方案 > Rails:与范围内的 trackable_type 的急切负载关联

问题描述

这是一个很难的。

我有一个Activity模型:

class Activity < ActiveRecord::Base
    belongs_to :trackable, polymorphic: true
    scope :include_all, -> { includes(:trackable) }
    ...
end

所以如果我这样做:

@activities = Activity.include_all

上面的代码运行良好,但如果我也想急切地加载可跟踪记录的父母怎么办?这些模型也有不同的父母:

Answer模型:

class Answer < ActiveRecord::Base
    belongs_to :question
    has_many :activities, as: :trackable
    scope :include_all, -> { includes(:question) }
    ...
end

Post模型:

class Post < ActiveRecord::Base
    belongs_to :blog
    has_many :activities, as: :trackable
    scope :include_all, -> { includes(:blog) }
    ...
end

Category模型:

class Category < ActiveRecord::Base
    has_many :activities, as: :trackable
    scope :include_all, -> {}
    ...
end

请注意,include_all每个模型中的范围都显示了要包含的关联。我努力了

class Activity < ActiveRecord::Base
    ...
    scope :include_all, -> { includes(trackable: :question) }
    ...
end

Activity当出现with trackable_type=时,这将中断Post

有任何想法吗?


Rick 的回答是一个非常好的方法,但是,有没有办法在另一个范围内使用关联范围?这对于没有父母喜欢的协会来说非常方便Category

就像是

scope :include_all, -> { includes(trackable -> { include_all } ) }

标签: ruby-on-railsscopeassociationseager-loading

解决方案


搞定了!如果您将范围直接添加到该belongs_to行,则关联将与该范围一起加载。

class Activity < ActiveRecord::Base
    belongs_to :trackable, -> { include_all } , polymorphic: true
    ...
end

推荐阅读