Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 为什么Model.all与rails 3中的Model.where(';true';)不同_Ruby On Rails_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails 为什么Model.all与rails 3中的Model.where(';true';)不同

Ruby on rails 为什么Model.all与rails 3中的Model.where(';true';)不同,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我有一个很好的查询: ModelName.where('true') 我可以将此链接与其他AR调用(如where、order等)链接。但是,当我使用: ModelName.all 我收到“相同”的响应,但无法将where或order链接到它,因为它是一个数组而不是AR集合。 虽然我使用第一种方法没有实际问题,但它似乎有点丑陋/不必要。有没有一个更干净的方法来做这件事,也许是一个.到活跃的\记录\收集或什么的 正如你所说: ModelName.where('true').class #=>

我有一个很好的查询:

ModelName.where('true')
我可以将此链接与其他AR调用(如where、order等)链接。但是,当我使用:

ModelName.all
我收到“相同”的响应,但无法将where或order链接到它,因为它是一个数组而不是AR集合。 虽然我使用第一种方法没有实际问题,但它似乎有点丑陋/不必要。有没有一个更干净的方法来做这件事,也许是一个.到活跃的\记录\收集或什么的

正如你所说:

ModelName.where('true').class #=> ActiveRecord::Relation

ModelName.all.class #=> Array
因此,只要不使用触发查询的
all
first
last
,就可以进行尽可能多的延迟加载

在考虑缓存时要注意这些差异。

我仍然不明白什么样的情况会让你陷入这样的境地:

ModelName.all.where(foobar)
。。。除非您出于一个目的需要整组资产,并从数据库中加载这些资产,还需要将其中的一个子集用于其他目的。对于这种情况,您需要使用ruby的数组过滤方法


旁注:

 ModelName.all
不应使用,这是一种反模式,因为您无法控制要检索多少项。希望:

 ModelName.limit(20).class #=> ActiveRecord::Relation

正如您所说,后者返回一个元素数组,而前者是一个
ActiveRecord::Relation
。您可以使用Ruby方法对数组进行排序和筛选。例如,要按id排序,可以调用
sort\u by(&:id)
。要筛选元素,可以调用
选择
拒绝
。对于
ActiveRecord::Relation
您可以像您所说的那样,将
链接到where
order


区别在于排序和处理的方向。对于数组,由应用程序完成;对于关系-通过数据库。当记录较多时,后者通常较快。它的内存效率也更高。

有一个简单的解决方案。而不是使用

ModelName.where('true')
使用:


啊!!我不明白这正是您需要的:)在Rails 4.2.x中,ModelName.scoped和ModelName.where(true)都被禁止。现在,如果您的遗留代码中有ModelName.all,那么您将得到一个AR关系,而不是预期的数组。如果您的现有代码中有ModelName.where(true)或ModelName.scope,您现在会收到一个错误,导致应用程序崩溃。我们需要做很多改进,但实际上,我们花了很多时间来破坏有效的语法。
ModelName.scoped