当前位置: 首页 > 面试题库 >

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

裴昕
2023-03-14
问题内容

举例来说:

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与简单数组/哈希相比,我最好让这些项作为的实例返回


问题答案:

当您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"


 类似资料:
  • 问题内容: 我可以不写速记吗? 我注意到将其他项目放回去是可行的(但是我不知道为什么或如果那是个好主意)。 编辑: 你们中有些人似乎感到困惑,为什么我要尝试这个。请放心,这完全是出于好奇。我喜欢弄乱JavaScript。 问题答案: 这也是一个选择: 仅在评估为true时才会调用。这称为短路。 它在这种情况下不常用,您真的不应该编写这样的代码。我鼓励这种更简单的方法: 您应该始终编写可读的代码;如

  • 问题内容: 几天前才意识到Docker似乎绕过了我的iptable规则。我对Docker和iptables并不感到不可思议。最近几天尝试了很多不同的事情。还看到最近的docker版本有了很大的变化,带有特殊的DOCKER链,应该可以让我做到这一点。但是不确定我做错了什么,但是却从不做我期望做的事情。 所以我想要的很简单。我希望它的行为像预期的那样。如果我有一个ACCEPT-Rule要通过,如果没有

  • 我希望表的所有都具有,其被的重写。 结果应该变成: 我可以通过单独的查询获得它,例如: 第二个查询的结果应该合并到第一个查询中,这样:“当第二个表中的boolean为TRUE时,用第一个表覆盖第二个表的结果” role_cap和enduser_cap表中的正确值都应该成为结果的一部分。但是,如果对于相同的user_cap_id,role_cap有FALSE条目,而enduser_cap有TRUE条

  • 有什么办法能做到这一点吗? 谢谢!

  • 问题内容: 根据文档ActiveRecord :: Transactions :: ClassMethods ,一个非新的嵌套事务将忽略回滚。从文档: 该被忽略,因为它是在一个子事务(或者更确切地说,它仍然是在父事务中,而不是自己的)。我不明白为什么两者都会忽略Rollback调用?我可以看到,由于子级’transaction’并不是真正的事务,它不会回滚’Nemu’块,但是为什么它不触发父级的回

  • 问题内容: 我有一个文本文件,内容为: 我已经了解了所有内容,并且一切运行正常,但事实是它读取了第一行,这是.txt文件的一种图例,必须将其忽略。 如何使用Scanner类忽略第一行? 问题答案: 在进行任何处理之前,只需调用一次scan.nextLine()即可解决问题。