Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Rails ActiveRecord使用join或INCLUDE而不是按sql查找两个表的属性_Ruby_Activerecord_Ruby On Rails 3.1 - Fatal编程技术网

Ruby Rails ActiveRecord使用join或INCLUDE而不是按sql查找两个表的属性

Ruby Rails ActiveRecord使用join或INCLUDE而不是按sql查找两个表的属性,ruby,activerecord,ruby-on-rails-3.1,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") 结果应该是,我从这两个表中获取所有属性,并且如果带有元数据的项与项表中的项不匹配,则属性为null。 另外,我在两个表之间没有任何关联,一些项目的id

下面给出了我想要的结果,但我正在试图弄清楚我是否可以用连接或包含来实现这一点

@items = Item.find_by_sql("SELECT *
    FROM items_with_metadata
    FULL OUTER JOIN items ON items.id = items_with_metadata.item_id")
结果应该是,我从这两个表中获取所有属性,并且如果带有元数据的项与项表中的项不匹配,则属性为null。 另外,我在两个表之间没有任何关联,一些项目的id恰好在两个表中

例如,如果我有 项目表与

 id | name | active
------------------
123 |  a   |   0
456 |  b   |   1
并且具有元数据的项\u已被删除

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的联接或包含或任何其他ActiveRecord方法来实现这一点,而这些方法不是通过sql查找的,那么:

Item.joins('items.id上带有元数据的完整外部联接items\u=带有元数据的items\u.Item\u id')

编辑:

您还可以使用:

@items = Item.includes(:items_with_metadata)
这将仅返回项目模型,但也将所有相关的ItemWithMetadata模型加载到内存中,内存将通过以下方式提供这些模型:

@items.first.items_with_metadata

最后一条语句不会导致DB查询,但会从内存中加载项元数据。

这只返回项的属性,而不返回带有元数据的项的属性。我编辑了我的答案。ActiveRecord引用的是对象而不是SQL表。您需要的数据将在内存中,但不能表示为包含两个表的列的联接的单个表。当您需要关联的元数据时,只需通过Item对象的相应方法来引用它。这仅在我有一个名为items\u与\u元数据的关联时才有效。但是正如前面提到的,我在表之间没有任何关联。它开始看起来更像是在不对我的表进行任何更改的情况下,我无法使用ActiveRecord方法做我想做的事情,而且可能必须像现在这样使用SQL。