Veraltete Warnung für Rails 4 has_many mit der Bestellung

class RelatedList  :position end 

Ich habe dieses Modell in meiner Rails-App, die eine Warnung austriggers, wenn ich versuche, Datensätze in der Konsole zu erstellen.

WARNUNG: Die folgenden Optionen in der Deklaration von RelatedList.has_many: contents sind veraltet:: order. Bitte verwenden Sie stattdessen einen Scope-Block. Zum Beispiel: has_many: spam_comments, Bedingungen: {spam: true}, classnname: ‘Kommentar’ sollte wie folgt umgeschrieben werden: has_many: spam_comments, -> {where spam: true}, klassenname: ‘Comment’. (aufgerufen von /Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7)

Es sieht so aus, als hätte Rails 4 eine neue Syntax: Order für die Verwendung in Modellen, aber ich kann die Dokumentation in den Rails Guides nicht finden.

In Rails 4:: :order ist veraltet und muss durch den Lambda-Scope-Block ersetzt werden, wie in der Warnung angezeigt, die Sie in der Frage gepostet haben. Ein weiterer zu beachtender Punkt ist, dass dieser Scope-Block vor allen anderen Assoziationsoptionen wie dependent: :destroy etc. übergeben werden muss.

Probieren Sie es aus:

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

Um die Reihenfolge anzugeben, also entweder asc oder desc wie @ joshua-coady und @wsprujit vorgeschlagen haben, verwenden Sie:

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

oder mit dem Hash-Stil:

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

Weitere Referenz zu Active Record Scopes für has_many .

Es hat eine Weile gedauert, bis ich herausgefunden hatte, wie man Ordnung und Include macht.

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

Ich dachte nur, ich würde hinzufügen, dass, wenn Sie irgendwelche Option Hash-Argumente haben, sie nach dem Lambda gehen müssen, wie folgt:

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

Nahm mich eine Minute, um dies herauszufinden – hoffentlich hilft es jedem anderen, der zu dieser Frage kommt, mit dem gleichen Problem.

Alternativ können Sie die Bestellklausel in das Modell einfügen, zum Beispiel:

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

Wird

 has_many :options # In class Answer default_scope { order 'name' } # In class Option 

PS: Ich habe ArgumentError: wrong number of arguments (1 for 0) wenn has_many :things, -> {} .