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来检查是否存在

假设我有ActiveRecord模型,
用户有一个: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"
  )