Départ Rails 4, Model.scoped
est maintenant obsolète.
DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead.
Mais, il y a une différence enModel.scoped
et Model.all
, qui est, scoped.scoped
renvoie un champ d'application, tout all.all
exécute la requête.
Sur Les Rails De 3:
> Model.scoped.scoped.is_a?(ActiveRecord::Relation)
=> true
Sur Les Rails De 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
Il y a des cas d'utilisation dans des bibliothèques et des préoccupations qui renvoie scoped
quand il y a une condition à faire quelque chose ou rien, comme suit:
module AmongConcern
extend ActiveSupport::Concern
module ClassMethods
def among(ids)
return scoped if ids.blank?
where(id: ids)
end
end
end
Si vous souhaitez modifier cette scoped
de all
, vous feriez face à des problèmes aléatoires selon l'endroit où l' among
a été utilisé dans le champ d'application de la chaîne. Par exemple, Model.where(some: value).among(ids)
exécutez la requête au lieu de retourner un champ d'application.
Ce que je veux, c'est un idempotent de la méthode sur ActiveRecord::Relation
qui retourne simplement une portée.
Que dois-je faire ici?