ここで理解することが重要なのは、includesを使用することで、railsはデータベース(この場合は写真)から元のモデルを直接返すだけでなく、写真を介して照会できるすべての関連するユーザーモデルをメモリにロードすることです。このアプローチは、DBクエリ時間が高価であり、メモリスペース/CPU時間を費やす方が効率的であることを前提としています。
実際には、クエリを実行した後、次のことを意味します。
@photos = Photo.where(:user_id => Relationship.select(:followed_id).where(:follower_id => user.id)<<user.id).includes(:user)
実行できます:
@photos.first.user
これはユーザーのDBには送られませんが、メモリからロードします(これは安価と見なされます)。したがって、写真のユーザーが必要な場合は、その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}
これにより、写真とユーザーハッシュを含む配列が返されます。