2012-09-11 44 views
0

以下是我想要的結果,但我試圖弄清楚是否可以使用join或include來完成此操作。Rails ActiveRecord使用join或include來代替find_by_sql來獲取兩個表的屬性

@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沒有在項目表中匹配的項目。 另外,我沒有這兩個表之間的關聯,一些物品的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

回答

0

任何其他ActiveRecord的方法怎麼樣:

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

編輯:

您還可以使用:

@items = Item.includes(:items_with_metadata) 

這將返回唯一項的機型,也將裝入所有相關的ItemWithMetadata車型的內存,這將使其可通過:

@items.first.items_with_metadata 

最後一條語句不會導致一個DB查詢,但需要從項目的元數據記憶。

+0

這隻返回來自項目的屬性,而不是來自items_with_metadata的屬性 – snowleopard

+0

我編輯了我的答案。 ActiveRecord引用對象而不是SQL表。您需要的數據將存儲在內存中,但不能表示爲包含兩個表'列的連接的單個表。當你需要關聯的元數據時,只需通過Item對象的相應方法來引用它。 –

+0

這隻適用於我有名爲items_with_metadata的關聯。但正如前面提到的,我沒有表格之間的任何關聯。它的開始看起來更像是沒有對錶格做任何改變,我無法使用ActiveRecord方法來做我想做的事情,並且可能必須像我一樣使用SQL。 – snowleopard

相關問題