web-dev-qa-db-fra.com

Portée par défaut de Rails 4

Dans l'application Rails, vous avez une étendue par défaut qui ressemble à ceci:

default_scope order: 'external_updated_at DESC'

Je suis maintenant passé à Rails 4 et, bien sûr, je reçois l'avertissement de dépréciation suivant: "L'appel de #scope ou #default_scope avec un hachage est obsolète. Utilisez un lambda contenant une portée." J'ai réussi à convertir mes autres portées mais je ne sais pas quelle devrait être la syntaxe de default_scope. Cela ne marche pas:

default_scope, -> { order: 'external_updated_at' }
73
Joe Gatt

Devrait être seulement:

class Ticket < ActiveRecord::Base
  default_scope -> { order(:external_updated_at) } 
end

default_scope accepte un bloc, lambda est nécessaire pour scope (), car il existe 2 paramètres, name et block:

class Shirt < ActiveRecord::Base
  scope :red, -> { where(color: 'red') }
end
150
Luke

C'est ce qui a fonctionné pour moi:

default_scope  { order(:created_at => :desc) }
21
qubit

Vous pouvez également utiliser le mot clé lambda. Ceci est utile pour les blocs multilignes.

default_scope lambda {
  order(external_updated_at: :desc)
}

ce qui équivaut à 

default_scope -> { order(external_updated_at: :desc) }

et

default_scope { order(external_updated_at: :desc) }
2
Chris McKnight

Cela a fonctionné de moi (juste pour illustration avec un où) car je suis venu à ce sujet via le même problème. 

default_scope { where(form: "WorkExperience") }
2
Vinozio

Cela fonctionne pour moi dans Rails 4

default_scope { order(external_updated_at: :desc) }
1
Hovo
default_scope { 
      where(published: true) 
}

Essaye ça.

0
aliAsadi92
default_scope -> { order(created_at: :desc) }

N'oubliez pas le symbole ->

0
Abel