6

考虑

def Foo
  has_one :user
end

假设我只想要一个Foo'sUser的名字,而不是任何其他列。所以我想要

SELECT name FROM "users" WHERE "prices"."id" = 123

但做foo.user.name会给我

SELECT * FROM "users" WHERE "prices"."id" = 123

是否有任何巧妙的方法可以使用关联来仅获取一列?如果没有,那么我必须这样做:

User.where(id: foo.user_id).pluck(:name).first
4

2 回答 2

4

通常,您可以使用 .select 方法指定要选择的列,例如:

User.select(:name).where(...)

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

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

以上内容未经测试,因此您可能需要对其进行调整,但一般来说,这种方法可以让您执行以下操作:

foo.bar_name

...不从 Bar 加载所有列。

于 2013-04-19T19:15:14.210 回答
1

不,在你的情况下has_one,但在 的情况下是的has_many

为关联返回的对象has_one不是一个范围,您可以在其上链接其他方法select,例如has_many. 它是模型的实际实例,实例化它必然涉及一个select *.

如果您只想选择名称,则必须User直接访问模型并使用select.

相反,如果您Foo有很多users,则可以使用foo.users.select("name")或任何其他可链接的方法,例如foo.users实际的ActiveRecord 关联,而不是模型的实例

于 2013-04-19T19:15:43.353 回答