首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#<Arel::Nodes::SqlLiteral>没有方法错误“映射”

#<Arel::Nodes::SqlLiteral>没有方法错误“映射”
EN

Stack Overflow用户
提问于 2012-02-16 02:17:17
回答 2查看 3.2K关注 0票数 4

我有以下示例查询:

代码语言:javascript
复制
source = "(SELECT DISTINCT source.* FROM (SELECT * FROM items) AS source) AS items"
items = Item.select("items.*").from(source).includes([:images])
p items # [#<Item id: 1>, #<Item id:2>]

然而,运行:

代码语言:javascript
复制
p items.count 

Arel::Node::SqlLiteral`的NoMethodError: undefined method映射结果

我理解这个查询很愚蠢,但是非simplifieid查询有点复杂,无法复制,这是我所能创建的最小的崩溃版本。有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-16 02:47:09

您能调用该对象上的all来将其从本质上转换为数组吗?

代码语言:javascript
复制
Item.select("items.*").from(source).includes([:images]).all.count

或者在这种情况下,size更合适。无论如何,这将执行查询并将所有对象加载到内存中,这可能是不可取的。

看起来问题就在你的includes([:images])上。在类似的应用程序中,我可以从控制台执行以下操作:

代码语言:javascript
复制
> Category.select('categories.*').from('(SELECT DISTINCT source.* FROM (SELECT * FROM categories) AS source) AS categories').count
  (0.5ms)  SELECT COUNT(*) FROM (SELECT DISTINCT source.* FROM (SELECT * FROM categories) AS source) AS categories

(注意,count重写SELECT子句,即使我显式地指定了items.*。但它们仍然是等价的查询。)

一旦我添加了一个includes范围,它就会失败:

代码语言:javascript
复制
> Category.select('categories.*').from('(SELECT DISTINCT source.* FROM (SELECT * FROM categories) AS source) AS categories').includes(:projects).count
NoMethodError: undefined method `left' for #<Arel::Nodes::SqlLiteral:0x131d35248>

我尝试了几种不同的获取计数的方法,比如select('COUNT(categories.*)'),但是它们在不同的方面都失败了。ActiveRecord似乎返回了一个基本的左外部连接来执行急切的加载,可能是因为它认为您在使用某种条件或外部表来执行连接,这似乎混淆了它执行计数的正常方法。请参阅关于在ActiveRecord::Associations docs中紧急加载的部分的末尾。

我的建议

如果联接不影响在外部查询中返回的行数,我认为最好的选择是执行一个查询以获得计数,并执行一个查询以获得实际结果。在分页应用程序中,我们必须执行类似的操作:一个查询返回当前页面的结果,另一个返回符合筛选条件的记录总数。

票数 4
EN

Stack Overflow用户

发布于 2016-10-25 18:33:11

这个问题是Rails #24193 https://github.com/rails/rails/issues/24193,它与from和急切的加载相结合。解决方法是使用以下表单:Item.select("items.*").from([Arel.sql(source)]).includes([:images])

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9304587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档