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

时间:2013-08-25 17:06:52

标签: sql ruby-on-rails

以示例:

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的实例返回,而不是简单数组/哈希

1 个答案:

答案 0 :(得分:2)

当您使用selectjoins进行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"