2012-09-11 25 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

相关问题