Com o Rails 4, o Model.scoped está obsoleto, mas o Model.all não pode substituí-lo
Começando Rails 4,Model.scoped
está agora obsoleto.
DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead.
Mas há uma diferençaModel.scoped
eModel.all
, isso é,scoped.scoped
retorna um escopo, enquantoall.all
executa a consulta.
Nos trilhos 3:
> Model.scoped.scoped.is_a?(ActiveRecord::Relation)
=> true
Nos trilhos 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
Existem casos de uso em bibliotecas / preocupações que retornamscoped
quando há uma condicional para fazer algo ou nada, assim:
module AmongConcern
extend ActiveSupport::Concern
module ClassMethods
def among(ids)
return scoped if ids.blank?
where(id: ids)
end
end
end
Se você mudasse issoscoped
paraall
, você enfrentaria problemas aleatórios dependendo de ondeamong
foi usado na cadeia do escopo. Por exemplo,Model.where(some: value).among(ids)
executaria a consulta em vez de retornar um escopo.
O que eu quero é um método idempotente emActiveRecord::Relation
que simplesmente retorna um escopo.
O que devo fazer aqui?