0

私のアプリの場合:

  • ユーザーhas_many画像、画像belongs_toユーザー
  • 画像has_1の場所、場所belongs_to画像

おそらく、場所のフィールドは画像の一部である必要があります。しかし、それにもかかわらず、私はこのクエリをRailsで書き込もうとしています。

    SELECT image.caption, location.latitude, location.longitude 
    FROM   image, location 
    WHERE  location.image_id = image.id 
    AND    image.user_id = 5

または、それが簡単な場合:

    SELECT  image.*, location.*
    FROM    image, location
    WHERE   location.image_id = image.id 
    AND     image.user_id = 5

これをActiveRecordクエリとしてどのように記述しますか?

4

1 に答える 1

1

EagerLoadingAssociationsについて読みたいと思います。

@images = Image.includes(:location).where("images.user_id = ?", 5)

これによりImageuser_id = 5。次に、関連付けられたインスタンスJOINを構築する2番目のクエリを実行します(これにより、が実行されます)Location.includes(:location)

これはimageslocationテーブルからすべての列を選択するため、代替クエリとより厳密に一致します。

このような方法で、関心のあるキーのみを含むハッシュを含む配列をこれに基づいて構築できます。

@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。しかし、知っておくのは良いことです。

于 2013-01-11T23:44:38.180 に答える