是否可以只询问ActiveRecord关联中的某些列?

Joh*_*hir 6 ruby activerecord ruby-on-rails associations

考虑

def Foo
  has_one :user
end
Run Code Online (Sandbox Code Playgroud)

假设我只想要一个Foo人的User名字,而不是任何其他专栏.所以我想要

SELECT name FROM "users" WHERE "prices"."id" = 123
Run Code Online (Sandbox Code Playgroud)

但是做foo.user.name会给我

SELECT * FROM "users" WHERE "prices"."id" = 123
Run Code Online (Sandbox Code Playgroud)

是否有任何光滑的方式使用该关联只获得一列?如果没有,那么我必须这样做:

User.where(id: foo.user_id).pluck(:name).first
Run Code Online (Sandbox Code Playgroud)

And*_*rew 4

一般来说,您可以使用 .select 方法指定要选择的列,例如:

User.select(:name).where(...)
Run Code Online (Sandbox Code Playgroud)

这将仅返回名称列中的值。您可以将其链接到关联上,但不能链接到实例上。因此,正如 meagar 通过否决其他答案(包括 Mori 删除的答案)非常积极地指出的那样,在关系中,has_one您不能将其链接到关联上(因为在这种情况下它不是关联)。但是,您可以构建自定义范围,如下所示:

class Foo < ActiveRecord::Base
  has_one :bar
  scope :bar_name, lambda {Bar.select(:name).where(:foo_id=> id)}
end
Run Code Online (Sandbox Code Playgroud)

上面的内容未经测试,因此您可能需要对其进行调整,但一般来说,该方法将允许您执行以下操作:

foo.bar_name
Run Code Online (Sandbox Code Playgroud)

...无需从 Bar 加载所有列。