0

以下は私が望む結果を取得しますが、代わりに結合またはインクルードを使用してこれを行うことができたかどうかを把握しようとしています。

@items = Item.find_by_sql("SELECT *
    FROM items_with_metadata
    FULL OUTER JOIN items ON items.id = items_with_metadata.item_id")

その結果、両方のテーブルからすべての属性を取得し、items_with_metadata が items テーブル内のアイテムと一致しなかった場合、属性は null になります。また、2 つのテーブル間に関連付けはありません。いくつかのアイテムの ID がたまたま両方のテーブルにあるだけです

たとえば、アイテムテーブルがある場合

 id | name | active
------------------
123 |  a   |   0
456 |  b   |   1

そして items_with_metadata には

color | usable | location | item_id
-----------------------------------
 red  |   yes  |   north  |  123

クエリの結果は

id  | name | active | color | usable | location | item_id
--------------------------------------------------------
123 |  a   |   0    |  red  |   yes  |   north  |  123
456 |  b   |   1    |       |        |          |

ActiveRecordの結合またはインクルード、またはfind_by_sqlではない他のActiveRecordメソッドを使用してこれを行う方法があることを望んでいました

4

1 に答える 1

0

どうですか:

Item.joins('FULL OUTER JOIN items_with_metadata ON items.id = items_with_metadata.item_id')

編集:

次のものも使用できます。

@items = Item.includes(:items_with_metadata)

これにより、Itemモデルのみが返されますが、関連するすべてのItemWithMetadataモデルがメモリにロードされ、次の方法で使用できるようになります。

@items.first.items_with_metadata

最後のステートメントはDBクエリを引き起こしませんが、メモリからアイテムのメタデータをロードします。

于 2012-09-11T17:59:52.513 に答える