我知道如何以及急切的加载是什么,我在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
,这相当快。有没有办法急于为一组用户加载所有活动?
答案 0 :(得分:0)
我发布了这个答案,以确保它已经解决了。一旦我有能力,我会接受这个作为正确答案。
Baldrick的评论让我思考我是如何为用户过滤活动的,以便我只将活动记录到活动组织。我在表演:
user.activities.where("organization_id = ?", org.id)
无论我做了什么,每次都会强制进行查询。所以我把它改成了:
user.activities.select { |o| o.id == org.id }
现在执行我想要的(在@ Baldrick建议之后)。