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

时间:2013-04-19 19:12:43

标签: ruby-on-rails ruby activerecord associations

考虑

def Foo
  has_one :user
end

假设我只想要Foo的{​​{1}}名称,而不是其他任何列。所以我想要

User

但是SELECT name FROM "users" WHERE "prices"."id" = 123 会给我

foo.user.name

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

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

2 个答案:

答案 0 :(得分:4)

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

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

这将只返回name列中的值。您可以将其链接到关联,但不能链接到实例。所以,正如meagar通过低估其他答案(包括Mori的删除答案)而非常积极地指出,在has_one关系中,你可以在关联上链接这个(因为它是#s;在这种情况下不是一种关联)。但是,您可以构建自定义范围,如下所示:

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

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

foo.bar_name

...而不加载Bar中的所有列。

答案 1 :(得分:1)

不,如果是has_one,则是has_many,则为是。

has_one关联返回的对象不是可以将select等其他方法链接到的范围,就像使用has_many一样。它是模型的实际实例,实例化它必然涉及select *

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

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