我尝试使用public_activity gem创建活动日志。当我加载特定用户的活动时,我使用以下命令:
@activity = PublicActivity::Activity.order("created_at desc").where(owner_id: @awardleader.authentication.id).includes(:trackable, trackable: :awardunit)
在这里,awardunit
关联不会一直存在。由于我跟踪了几个模型,有时跟踪的模型没有奖励单元。那么,我们怎样才能在关联时才加载关联?
PS:我想获得所有活动......在该列表中,可以有来自不同模型的活动。有些模型没有Awardunit作为协会。所以,上面的代码给出了一个错误,说该模型没有Awardunit!
PS:如果我使用我在问题中显示的代码,它会给我一个错误,例如“在Gold上找不到名为'awardunit'的协会;也许你拼错了它?”。问题是我无法删除加载award_unit,因为一些可跟踪的人有奖励
答案 0 :(得分:2)
包含多态关联,如
PublicActivity::Activity.includes(:trackable)
将返回
通过为数据库生成LEFT OUTER JOIN
来实现这一点。
声明关联是多态的,如
class PublicActivity::Activity < ActiveRecord::Base
belongs_to :trackable, polymorphic: true
end
在您的activities
数据库表trackables_type
和trackables_id
中添加两列。您可以在查询中使用这些。
如果您只想获得任何类型的可跟踪关联的活动,请使用
PublicActivity::Activity.includes(:trackable).where.not(trackable_type: nil)
如果您只想获得与AwardUnit
关联的活动,请使用
PublicActivity::Activity.includes(:trackable).where(trackable_type: :award_unit)