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