如何在父母急切加载后急切加载关联?

时间:2013-07-02 06:42:04

标签: ruby-on-rails ruby rails-activerecord

我知道如何以及急切的加载是什么,我在Google和StackOverflow上搜索其他热切的加载问题。他们中的一些人很有启发性,但没有一个能解决我的问题,所以我自己会问一个问题。

这是我的架构:

class Organization < ActiveRecord::Base
  has_many :activities
  has_many :users_logged, source: :user, through: :activities
end

class Activity < ActiveRecord::Base
  belongs_to :user
  belongs_to :organization
end

class User < ActiveRecord::Base
  has_many :activities
end

这个项目是继承的,我不能做任何主要的架构重新设计,所以如果架构无法解决问题,那就这样吧。我只想尝试加快这些报告的生成,这些报告涉及加载所有组织,例如:

Organizations.includes(:users_logged).joins(:activities)

现在,我在此意识到includes(:users_logged)将加载所有活动,但joins(:activities)对于我排除的排序/分组的字段仍然是必需的,因为它们对于问题。

现在的问题是,我希望为includes(:users_logged)指令选择的所有用户加载所有活动,因为我不仅需要组织详细信息,它还有相关活动以及所有用户已记录组织的活动。除此之外,我需要为用户加载所有活动(理想情况下与组织相关联,但一旦我弄清楚如何加载,我就可以解决这个问题。)

我目前的实施:

@orgs = Organization.includes(:users_logged).joins(:activities).all
@orgs.each do |org|
  org.users_logged.each do |user|
    # Just work with user.activities
  end
end

这导致每个用户的查询使用当前的测试数据量平均0.3 ms,这相当快。有没有办法急于为一组用户加载所有活动?

1 个答案:

答案 0 :(得分:0)

我发布了这个答案,以确保它已经解决了。一旦我有能力,我会接受这个作为正确答案。

Baldrick的评论让我思考我是如何为用户过滤活动的,以便我只将活动记录到活动组织。我在表演:

user.activities.where("organization_id = ?", org.id)

无论我做了什么,每次都会强制进行查询。所以我把它改成了:

user.activities.select { |o| o.id == org.id }

现在执行我想要的(在@ Baldrick建议之后)。