ActiveRecord:检查关联是否存在而不加载它?
假设我有ActiveRecord模型,ActiveRecord:检查关联是否存在而不加载它?,activerecord,Activerecord,假设我有ActiveRecord模型,用户有一个:photo。在数据库中,photos有一个t.binary列,该列可能包含大量数据,因此除非我需要,否则我不想选择该列 我想做一些类似的事情: users.each do |user| image_tag(user_photo_path) if user.photo.present? end 但是,我不想调用user.photo.present?,因为: 这样做会加载照片关联,包括从照片中选择* 即使只能通过从照片中选择id来检查是否存在
用户有一个:photo
。在数据库中,photos
有一个t.binary
列,该列可能包含大量数据,因此除非我需要,否则我不想选择该列
我想做一些类似的事情:
users.each do |user|
image_tag(user_photo_path) if user.photo.present?
end
但是,我不想调用user.photo.present?
,因为:
- 这样做会加载
照片
关联,包括从照片中选择*
- 即使只能通过
从照片中选择id
来检查是否存在,它仍然是一个N+1查询
我真正想要的是用一个查询加载用户
,该查询为每个用户提供一个属性,告诉我它是否有关联的照片。使用ActiveRecord 5,这可以:
class User < ActiveRecord::Base
scope :with_photo_id, -> {
left_outer_joins(:photo).select(
"users.*, photos.id AS photo_id"
)
}
end
joins(
"LEFT OUTER JOIN photos ON photos.user_id = users.id"
)