一个拥有并属于多个关联的关联是否可以不调用关联对象上的查询

Can a has and belongs to many association not call a query on the associated object

我有两个模型活动和用户

class Activity < ActiveRecord::Base
  has_and_belongs_to_many :users
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :activities
end

我可以通过调用

加载与用户关联的所有活动
User.all.includes(:activities)

但这实际上会从数据库中提取我所有的 activity 对象,这可能会导致性能问题,因为 table 非常大。我的要求只是让activity_ids关联

我可以通过在连接 table

上执行普通的 sql 直接得到它
select activity_id from activities_users where user_id in (...)

我的问题是: 我能否以 rails 友好的方式获得上述功能

has_and_belongs_to_many 开始,您可以做 @User.find(1).activity_ids

就将它们包含在集合中以避免 n+1 查询而言,我认为除了您当前获得它的方式之外,您无法以任何其他方式做到这一点。

如果你把它变成 has_many_through 它将有一个模型:

class Activity < ActiveRecord::Base
  has_many :user_activities
  has_many :users, through: :user_activities
end

class User < ActiveRecord::Base
  has_many :user_activities
  has_many :activities, through: :user_activities
end

class UserActivity < ActiveRecord::Base
  belongs_to :user
  belongs_to :activity
end

然后你可以做 @users = User.includes(:user_activities).all 所以当你遍历它们并做类似的事情时应该避免 n+1 查询,因为你已经加载了它们。

@users.each do |user|
  user.activity_ids
end