这里需要理解的重要一点是,通过使用包含,rails 直接从数据库中返回原始模型(在本例中为照片),但也会将所有关联的用户模型加载到内存中,这些模型可以通过照片进行查询。这种方法假设 DB 查询时间很昂贵,并且花费内存空间/CPU 时间更有效。
实际上,这意味着在您执行查询之后:
@photos = Photo.where(:user_id => Relationship.select(:followed_id).where(:follower_id => user.id)<<user.id).includes(:user)
你可以运行:
@photos.first.user
这不会为用户进入数据库,而是从内存中加载(这被认为很便宜)。因此,当您需要照片的用户时,您只需运行它的user
方法即可,您不必在({user:{},photo:{}},{user:{},photo:{}},{user:{},photo:{}})
结构中预先组织它 - 只需在需要时加载用户即可。
如果由于某种原因您必须以这种特定方式组织它,您可以:
@photos = Photo.where(:user_id => Relationship.select(:followed_id).where(:follower_id => user.id)<<user.id).includes(:user)
@photos = @photos.map {|p| {:user => p.user, :photo => p}
这将返回一个包含照片和用户哈希的数组。