Mit Rails 4 ist Model.scoped veraltet, Model.all kann es jedoch nicht ersetzen

Startschienen 4,Model.scoped ist jetzt veraltet.

DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead.

Aber es gibt einen Unterschied inModel.scoped undModel.all, das ist,scoped.scoped gibt einen Bereich zurück, währendall.all führt die Abfrage aus.

Auf Schienen 3:

> Model.scoped.scoped.is_a?(ActiveRecord::Relation)
=> true

Auf Schienen 4:

> Model.all.all.is_a?(ActiveRecord::Relation)
DEPRECATION WARNING: Relation#all is deprecated. If you want to eager-load a relation, you can call #load (e.g. `Post.where(published: true).load`). If you want to get an array of records from a relation, you can call #to_a (e.g. `Post.where(published: true).to_a`).
=> false

Es gibt Anwendungsfälle in Bibliotheken / Anliegen, die zurückgegeben werdenscoped wenn es eine Bedingung gibt, um etwas oder nichts zu tun, wie folgt:

module AmongConcern
  extend ActiveSupport::Concern

  module ClassMethods
    def among(ids)
      return scoped if ids.blank?

      where(id: ids)
    end
  end
end

Wenn du das ändern würdestscoped zuallSie würden zufällige Probleme je nachdem, wo dieamong wurde in der Scope-Kette verwendet. Zum Beispiel,Model.where(some: value).among(ids) würde die Abfrage ausführen, anstatt einen Bereich zurückzugeben.

Was ich will, ist eine idempotente MethodeActiveRecord::Relation das gibt einfach einen Bereich zurück.

Was soll ich hier machen

Antworten auf die Frage(4)

Ihre Antwort auf die Frage