一个拥有并属于多个关联的关联是否可以不调用关联对象上的查询
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
我有两个模型活动和用户
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