在Rails中,如果协会不是零,如何急切加载关联?

时间:2013-12-20 10:42:57

标签: ruby-on-rails ruby ruby-on-rails-4

我尝试使用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,因为一些可跟踪的人有奖励

1 个答案:

答案 0 :(得分:2)

包含多态关联,如

PublicActivity::Activity.includes(:trackable)

将返回

  1. 所有活动,无论他们是否有可跟踪的关联。如果没有可追踪的,则不会加载任何其他内容。
  2. 包括任何类型的可跟踪,无论其类型如何
  3. 通过为数据库生成LEFT OUTER JOIN来实现这一点。

    声明关联是多态的,如

    class PublicActivity::Activity < ActiveRecord::Base
      belongs_to :trackable, polymorphic: true
    end
    

    在您的activities数据库表trackables_typetrackables_id中添加两列。您可以在查询中使用这些。

    如果您只想获得任何类型的可跟踪关联的活动,请使用

    PublicActivity::Activity.includes(:trackable).where.not(trackable_type: nil)
    

    如果您只想获得与AwardUnit关联的活动,请使用

    PublicActivity::Activity.includes(:trackable).where(trackable_type: :award_unit)