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
zuall
Sie 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