0

多くの写真を持つモデルユーザーがいます。

ユーザーフィード(他のユーザーからの写真、ユーザーを含める必要があります)を取得する必要があるため、クエリは次のようになります。

Photo.where(:user_id => Relationship.select(:followed_id).where(:follower_id => user.id)<<user.id).joins(:user)

しかし、ユーザー情報なしで写真だけを取得します。次のようなものを返すクエリを作成することは可能ですか:

({user:{},photo:{}},{user:{},photo:{}},{user:{},photo:{}})
4

2 に答える 2

3

ここで理解することが重要なのは、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}

これにより、写真とユーザーハッシュを含む配列が返されます。

于 2012-09-11T18:11:32.080 に答える
0

あなたのコメントに基づいて、あなたはおそらくあなたの元の投稿に従って結果を別のメソッドに渡すことになっているように、1つのレベルの連鎖クエリが必要です。これは完全にテストされていませんが、私はそれがあなたが達成する必要があるものの方向にあると思います。アイデアは、現在のユーザーがフォロワーであるすべてのリレーションシップオブジェクトを取得することです。次に、followerという名前のユーザーオブジェクトを含めます。belongs_toリレーションシップモデルでの定義方法によっては、そのシンボルを変更する必要がある場合があります。そこから写真を含めます。

結果のクエリによっては、エラーがスローされる場合があります。含まれている場合は、テーブル名を指定して、シンボルを文字列に切り替えます。これを試みてエラーが発生した場合は、スタックトレースを使用して質問を編集してください。

Relationship.where(:follower_id => user.id).includes(:follower).includes(:photos)
于 2012-09-11T17:17:40.397 に答える