Con Rails 4, Model.scoped está en desuso pero Model.all no puede reemplazarlo
Rieles de arranque 4,Model.scoped
ahora está en desuso.
DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead.
Pero, hay una diferencia enModel.scoped
yModel.all
, es decir,scoped.scoped
devuelve un alcance, mientrasall.all
ejecuta la consulta.
En los carriles 3:
> Model.scoped.scoped.is_a?(ActiveRecord::Relation)
=> true
En los carriles 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
Hay casos de uso en bibliotecas / preocupaciones que devuelvescoped
cuando hay un condicional para hacer algo o nada, así:
module AmongConcern
extend ActiveSupport::Concern
module ClassMethods
def among(ids)
return scoped if ids.blank?
where(id: ids)
end
end
end
Si tu cambias estoscoped
aall
, te enfrentarías a problemas aleatorios dependiendo de dondeamong
Fue utilizado en la cadena de alcance. Por ejemplo,Model.where(some: value).among(ids)
ejecutaría la consulta en lugar de devolver un ámbito.
Lo que quiero es un método idempotente enActiveRecord::Relation
Eso simplemente devuelve un alcance.
¿Qué debo hacer aquí?