Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails _Ruby On Rails_Ruby_Activerecord_Arel - Fatal编程技术网

Ruby on rails

Ruby on rails ,ruby-on-rails,ruby,activerecord,arel,Ruby On Rails,Ruby,Activerecord,Arel,我有以下示例查询: Arel::Nodes::SqlLiteral的NoMethodError:undefined methodmap'结果` 我理解这个查询很愚蠢,但是非simplifieid查询有点太复杂,无法复制,这是我能创建的最小崩溃版本。有什么想法吗?你能调用该对象上的所有元素来将其强制转换为数组吗 Item.select("items.*").from(source).includes([:images]).all.count 或者在这种情况下,尺寸更合适。在任何情况下,这将执行查

我有以下示例查询:

Arel::Nodes::SqlLiteral的NoMethodError:undefined methodmap'结果`

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

你能调用该对象上的所有元素来将其强制转换为数组吗

Item.select("items.*").from(source).includes([:images]).all.count
或者在这种情况下,尺寸更合适。在任何情况下,这将执行查询并将所有对象加载到内存中,这可能是不可取的

看起来问题出在您的include[:images]上。在类似的应用程序上,我可以从控制台执行此操作:

> 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
请注意,计数覆盖SELECT子句,即使我明确指定了items.*。但它们仍然是等价的查询

一旦我添加一个包含范围,它就会失败:

> 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>
我尝试了几种不同的获取计数的方法,比如选择“COUNTcategories.*”,但它们都以各种方式失败。ActiveRecord似乎在使用基本的左外部联接来执行急切加载,可能是因为它认为您正在使用某种条件或外部表来执行联接,这似乎混淆了它执行计数的正常方法。请参阅中有关快速加载的部分的结尾

我的建议
如果联接不影响外部查询中返回的行数,那么最好执行一个查询来获得计数,执行一个查询来获得实际结果。我们必须在分页应用程序中执行类似的操作:一个查询返回结果的当前页面,一个查询返回与筛选条件匹配的记录总数。

问题是Rails 24193,与from和急切加载有关。解决方法是使用以下格式:Item.selectitems.*.from[Arel.sqlsource].includes[:images]

返回的是一个字符串,它是Arel::Nodes::SqlLiteral从中继承的。items.class和/或items.inspect显示了什么?@ScottJShea items.class是ActiveRecord::Relation。这是一个对象继承类,因此无论哪种方式,它都不会显示为可枚举类。Brandan下面的答案可能是关于某个问题的。只有当您使用从、包含和一起计数、从活动记录/关联/别名抛出时,才会发生这种情况。我通过调用preload而不是includes来解决同样的问题。这与快速加载相同,但似乎避免了/includes/count的任何问题。调用all确实有效,但是这会更改查询并强制执行将所有对象加载到内存中的操作。如果不呼叫所有人,它是否可以工作?嗯。我将根据您的回答更新我的答案,因为它太长,无法发表评论:-如果此问题是由于使用from引起的。。。对于索引提示,您可以使用最新版本的activerecord mysql索引提示gem,它可以很好地处理这个问题。
> 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
> 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>