【问题标题】:Eager loading fetches all fields though select is explicitly specified尽管明确指定了选择,但渴望加载会获取所有字段
【发布时间】:2013-02-01 15:29:16
【问题描述】:

我有一个这样的查询,

company.users.select("users.id, users.state").includes(:organization)

在这里,我急于加载关联 organization。我期望在对象中获取属性 id 和 user_id ,但随后我获取了所有字段。

当我们急切加载或者我在这里遗漏了什么时,rails 的行为是这样吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.2 eager-loading


    【解决方案1】:

    在您的情况下,您将获得所有公司用户而不是组织。

    预加载意味着预加载数据库行。它不会只获取属性。它加载所有关联的行。

    例如:

     comments = Comment.all(:select => "users.name,comment_text", :include => :user)
    

    在这里,它不会只从用户表中加载名称。它将从数据库中获取所有用户行。因此,您不必触发额外的查询。还有一件事是当您使用 include 时,当您具有包含表的属性时,将忽略 select 子句。有关更多信息,请通过 ryan bates rialscast 了解加入与包括:http://railscasts.com/episodes/181-include-vs-joins

    【讨论】:

    • 在上面的查询中,如果 cmets 表有 20 条记录和 10 列,它会加载所有这些,但是如果我只需要这 20 条记录中的 2 列,我该怎么做?对于我提到的查询,我无法做到
    • @ManjunathManohar 对不起对不起。
    • @ManjunathManohar 交叉检查。使用急切加载时会忽略 select 子句。如果您使用连接选择将起作用。
    • @ManjunathManohar 在你的情况下,当你只需要id and user_id 时,为什么你急于加载organizations。是id and user_id 属于组织。你能解释一下什么是id and user_id
    • id 和 user_id 是 company 表中的列
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多