【问题标题】:rails select with includes带有包含的导轨选择
【发布时间】:2013-08-03 04:47:49
【问题描述】:

我的 rails 3.2 应用程序中有这些代码

User.includes(:profile).limit(10)

从配置文件表中选择所有字段我需要一种方法来选择配置文件表中的特定字段以减少数据库查询 我正在使用 postgresql

【问题讨论】:

标签: ruby-on-rails activerecord rails-postgresql


【解决方案1】:

你最好使用类似的东西

User.joins(:profile).select("users.*, profiles.field1, profiles.field2").limit(10)

【讨论】:

    【解决方案2】:

    我想你,求select方法。

    User.includes(:profile).limit(10).select(:field1, :field2)
    

    更新:

    @Hassan 的回答并没有真正奏效。看here(急加载部分)

    由于一次只加载一个表,条件或订单不能引用除主表之外的表。

    尝试以下操作:

    class User < ActiveRecord::Base
      has_one :profile_w_name, -> { select(:id, :name, :user_id).limit(10) }, class_name: 'Profile'
    end
    
    User.includes(:profile_w_name).first.profile_w_name
    

    不要忘记添加user_id字段,因为AR会尝试预加载配置文件字段。

    更新:

    在看到弃用警告抱怨急切加载和 SQL sn-p 引用像 select("post.id, comment.post_id") 之后,我找到了一个更好的解决方案。需要 Rails 4。

    User.includes(:profile).select(:field1, :field2).references(:profile)
    

    还可以查看此要点以查看差异https://gist.github.com/astery/6137727

    【讨论】:

    • 它将从用户表中选择我想从配置文件表中选择特定字段
    • 你为什么这么认为?你试过要点了吗?
    • 如果我理解正确的第二次更新,你可以这样做吗? @users = User.includes(:profile).select('user.id, user.name, profile.id, profile.something, profile.something_else').references(:profile) ?
    • 所以这会生成两个这样的查询? SELECT id, name FROM usersSELECT id, something, something else FROM profiles WHERE user_id IN ( user IDs here )
    • @Lykos,我在 gist 中为您留下了带有调试输出的评论。
    【解决方案3】:

    Rails 5 Way:只需添加对关联表名的引用即可。

    User.includes(:profile).select("users.*, profiles.field1, profiles.field2").limit(10).references(:profiles)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多