110 votes

Avertissement obsolète pour Rails 4 has_many avec ordre

class RelatedList < ActiveRecord::Base
  extend Enumerize

  enumerize :list_type, in: %w(groups projects)

  belongs_to :content
  has_many :contents, :order => :position

end

J'ai ce modèle dans mon application Rails qui génère un avertissement lorsque j'essaie de créer des enregistrements dans la console.

AVERTISSEMENT DE DÉPRÉCARISATION : Les options suivantes dans votre fichier RelatedList.has_many :contents sont obsolètes : :order. Veuillez utiliser un bloc scope à la place. Par exemple, la déclaration suivante : has_many :spam_comments, conditions : { spam : true }, class_name : 'Comment'. devrait être réécrit comme suit : has_many :spam_comments, -> { où spam : true }, nom_de_classe : 'Comment'. . (appelé depuis /Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7)

Il semble que Rails 4 dispose d'une nouvelle syntaxe :order à utiliser dans les modèles, mais je ne parviens pas à trouver la documentation dans les guides Rails.

256voto

vee Points 20897

Dans Rails 4, :order a été déprécié et doit être remplacé par un bloc de portée lambda, comme le montre l'avertissement que vous avez publié dans la question. Un autre point à noter est que ce bloc scope doit être passé avant toute autre option d'association telle que dependent: :destroy etc.

Essayez ceci :

has_many :contents, -> { order(:position) } # Order by :asc by default

Pour préciser le sens de la commande, c'est-à-dire soit asc ou desc comme @joshua-coady et @wsprujit l'ont suggéré, utilisez :

has_many :contents, -> { order 'position desc' }

ou, en utilisant le style dièse :

has_many :contents, -> { order(position: :desc) }

Autres références sur Portée de l'enregistrement actif pour has_many .

38voto

sfoop Points 71

J'ai mis du temps à comprendre comment faire pour ordonner et inclure, mais j'ai fini par trouver que chaîne la portée déclarations,

has_many :things, -> { includes(:stuff).order("somedate desc") }, class_name: "SomeThing"

31voto

Wylliam Judd Points 1748

J'ai juste pensé que je devais ajouter que si vous avez des arguments de hachage d'option, ils doivent aller après la lambda, comme ceci :

has_many :things, -> { order :stuff }, dependent: :destroy

Il m'a fallu une minute pour trouver la solution. J'espère que cela aidera les personnes qui rencontrent le même problème.

0voto

Dave Points 3309

Cela fonctionne pour moi avec Rails 4 & MongoDB

has_many :discounts, order: :min_amount.asc

-4voto

Dorian Points 2384

Alternativement, vous pouvez mettre le order sur le modèle, par exemple :

has_many :options, order: 'name' # In class Answer

Devient

has_many :options # In class Answer

default_scope { order 'name' } # In class Option

PS : J'ai ArgumentError: wrong number of arguments (1 for 0) en faisant has_many :things, -> {} .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X