下面是一个包含的嵌套select:
@items = Item.where("complete = ?", true).includes( :manufacturer, {:order=>[:supplier, :agent] })
这是一个繁重的查询,因为它从上面包含的所有表中提取了数千行数据。
如何使查询只选择特定字段?
- user.name,用户.创建时间
- 订单创建时间
- supplier.name
- agent.name
- manufacturer.name
下面是一个包含的嵌套select:
@items = Item.where("complete = ?", true).includes( :manufacturer, {:order=>[:supplier, :agent] })
这是一个繁重的查询,因为它从上面包含的所有表中提取了数千行数据。
如何使查询只选择特定字段?
5条答案
按热度按时间pepwfjgg1#
ARel中有一个select方法,但是您必须使用正确的表名(即复数,如果您有多态模型或者如果您正在使用set_table_name或其他类似的非标准实践,请注意)
“我们可以使用不包含连接的选择”- @Bhavesh_A_P
注:
正如上面@Bhavesh_A_P指出的,
select
与includes
不会产生一致的行为。看起来如果包含的关联没有返回结果,select
将正常工作,如果它返回结果,select语句将不起作用。事实上,它将被完全忽略。这样您的select语句就可以引用无效的表名,并且不会产生错误。select
与joins
将产生一致的行为。rjjhvcjd2#
实际上,我们不能使用select和includes,它只能和joins一起使用。
tmb3ates3#
在链接中包含'select'方法的呼叫并不能解决问题。在我们建置的类似ActiveRecord::Relation中,呼叫'includes'似乎会覆写任何'select'的呼叫。
如图所示,查询会选取所有数据行。
当这两个范围使用'joins'而不是'includes'时,查询会运作:仅选择3个指定的列。
iyr7buue4#
8fq7wneg5#
正如其他人所指出的,如果有
.includes(...)
,使用.select(...)
会被覆盖。我不喜欢这样...所以我找到了一个补丁来使它工作,并将其作为**The Brick的一部分发布。通过像这样覆盖
ActiveRecord::Associations::JoinDependency.apply_column_aliases()
*,当您添加.select(...)
时,它可以作为筛选器来选择构建哪些列别名。加载了
gem 'brick'
之后,为了启用这种选择性行为,添加特殊列名:_brick_eager_load
作为.select(...)
中的第一个条目,这将在构建别名时启用列过滤。由于外键对于正确关联所有内容是必不可少得,因此它们是自动添加得,因此您不需要将它们包括在选择列表中.
希望它可以保存您的查询时间和一些内存!