【发布时间】:2013-08-03 04:47:49
【问题描述】:
我的 rails 3.2 应用程序中有这些代码
User.includes(:profile).limit(10)
从配置文件表中选择所有字段我需要一种方法来选择配置文件表中的特定字段以减少数据库查询 我正在使用 postgresql
【问题讨论】:
标签: ruby-on-rails activerecord rails-postgresql
我的 rails 3.2 应用程序中有这些代码
User.includes(:profile).limit(10)
从配置文件表中选择所有字段我需要一种方法来选择配置文件表中的特定字段以减少数据库查询 我正在使用 postgresql
【问题讨论】:
标签: ruby-on-rails activerecord rails-postgresql
你最好使用类似的东西
User.joins(:profile).select("users.*, profiles.field1, profiles.field2").limit(10)
【讨论】:
我想你,求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 users 和 SELECT id, something, something else FROM profiles WHERE user_id IN ( user IDs here )
Rails 5 Way:只需添加对关联表名的引用即可。
User.includes(:profile).select("users.*, profiles.field1, profiles.field2").limit(10).references(:profiles)
【讨论】: