web-dev-qa-db-fra.com

Avertissement obsolète pour Rails 4 has_many with order

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 émet un avertissement lorsque j'essaie de créer des enregistrements dans la console.

AVERTISSEMENT DE DEPRECATION: Les options suivantes dans votre RelatedList.has_many: les déclarations de contenu sont obsolètes:: order . Veuillez utiliser un bloc de portée à la place. Par exemple, ce qui suit: has_many : spam_comments, conditions: {spam: true}, nom de classe: 'Comment' doit être réécrit comme suit: has_many: spam_comments, -> { où spam: vrai}, nom_classe: 'Commentaire' . (appelé depuis /Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7)

Il semble que Rails 4 ait une nouvelle syntaxe: la syntaxe de commande à utiliser dans les modèles, mais je n'arrive pas à trouver la documentation dans les guides Rails.

99
shankardevy

Dans Rails 4, :order est obsolète et doit être remplacé par un bloc de portée lambda, comme indiqué dans l'avertissement que vous avez posté dans la question. Un autre point à noter est que ce bloc d’étendue doit être passé avant toute autre option d’association telle que dependent: :destroy etc. 

Essayez ceci:

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

Pour spécifier la direction de l'ordre, c'est-à-dire asc ou desc comme @ joshua-coady et @wsprujit l'ont suggéré, utilisez: 

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

ou, en utilisant le style de hachage: 

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

Autres références sur Active Record Scopes for has_many .

236
vee

Il m'a fallu un certain temps pour comprendre comment passer une commande et l'inclure. J'ai finalement constaté que vous enchaînez la portée déclarations,

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

Je pensais juste que j'ajouterais que si vous avez des arguments de hash optionnels, ils doivent aller après le lambda, comme ceci:

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

Cela m’a pris une minute pour le comprendre moi-même - j'espère que cela aidera tout le monde à venir à cette question avec le même problème.

19
Wylliam Judd

Cela fonctionne pour moi avec Rails 4 & MongoDB

has_many :discounts, order: :min_amount.asc
0
Dave