EagerLoadingAssociationsについて読みたいと思います。
@images = Image.includes(:location).where("images.user_id = ?", 5)
これによりImage、user_id = 5。次に、関連付けられたインスタンスJOINを構築する2番目のクエリを実行します(これにより、が実行されます)。Location.includes(:location)
これはimages、locationテーブルからすべての列を選択するため、代替クエリとより厳密に一致します。
このような方法で、関心のあるキーのみを含むハッシュを含む配列をこれに基づいて構築できます。
@hash_object = @images.collect { |i| { caption: i.caption, latitude: i.location.latitude, longitude: i.location.longitude } }
.joins(:location)単一のクエリのみでこれを構築する場合は、と組み合わせて使用できます.includes(:location)
Image.joins(:location).includes(:location).where("images.user_id = ?", 5)
重要:Imageこれにより、関連付けられていないインスタンスは省略されますLocation。これを支援するために少し変更することができますjoins()が、上記ではこの省略があります。
本当に特定の列のみを選択したい場合は、特定の列の選択を読んでください。ただし、これを使用する場合の警告があります。
selectメソッドが使用される場合、返されるすべてのオブジェクトは読み取り専用になります。
と
これは、選択したフィールドのみを使用してモデルオブジェクトを初期化することも意味するため、注意してください。
Railsマスター(3.2.11にはない)では、複数の列を渡すことができますが.pluck()、これは単一のテーブルにのみ制限されているように見えます(テーブルを取得できず、からプルする場合)locations:latitude:longitudeImage。しかし、知っておくのは良いことです。