Rails ActiveRecord使用join或includes代替find_by_sql来获取两个表的属性

时间:2012-09-11 16:48:49

标签: ruby activerecord ruby-on-rails-3.1

以下内容为我提供了我想要的结果,但我想知道我是否可以通过加入或包含来完成此操作。

@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。 另外,我在两个表之间没有任何关联,某些项的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方法

1 个答案:

答案 0 :(得分: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

最后一个语句不会导致数据库查询,而是从内存中加载项元数据。