以下内容为我提供了我想要的结果,但我想知道我是否可以通过加入或包含来完成此操作。
@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方法
答案 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
最后一个语句不会导致数据库查询,而是从内存中加载项元数据。