考虑
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
答案 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关联,而不是模型的实例。