小编典典

使用.select时,Rails会忽略第二个表中的列

sql

举例来说:

r = Model.arel_table
s = SomeOtherModel.arel_table
Model.select(r[:id], s[:othercolumn].as('othercolumn')).
joins(:someothermodel)

将产生sql:

`SELECT `model`.`id`, `someothermodel`.`othercolumn` AS othercolumn FROM `model` INNER JOIN `someothermodel` ON `model`.`id` = `someothermodel`.`model_id`

哪个是正确的。但是,在加载模型时,该属性将othercolumn被忽略,因为它不是的属性Model

它与渴望加载和相似includes,但是我不希望所有列,仅指定的列include是不好的。

必须有一种简单的方法来从其他模型获取列吗?Model与简单数组/哈希相比,我最好让这些项作为的实例返回


阅读 137

收藏
2021-04-07

共1个答案

小编典典

当您select使用joins或进行时includes,将返回ActiveRecordRelation。它ActiveRecordRelation仅由您用来调用的类的对象组成select。从联接模型中选择的列将添加到返回的对象中。由于这些属性不是Model的属性,因此当您检查这些对象时它们不会出现,并且我相信这是造成混淆的主要原因。

您可以在rails控制台中尝试以下操作:

> result = Model.select(r[:id], s[:othercolumn].as('othercolumn')).joins(:someothermodel)
=> #<ActiveRecord::Relation [#<Model id: 1>]>

# "othercolumn" is not shown in the result but doing the following will yield correct result
> result.first.othercolumn
=> "myothercolumnvalue"
2021-04-07