it-swarm.com.de

Veraltete Warnung für Rails 4 has_many bei Bestellung

class RelatedList < ActiveRecord::Base
  extend Enumerize

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

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

end

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

DEPRECATION WARNUNG: Die folgenden Optionen in Ihrem RelatedList.has_many: Inhaltsdeklaration ist veraltet:: order . Bitte verwenden Sie stattdessen einen Gültigkeitsbereich. Zum Beispiel Folgendes: has_many : spam_comments, Bedingungen: {spam: true}, class_name: 'Comment' sollte wie folgt umgeschrieben werden: has_many: spam_comments, -> { wo Spam: wahr}, Klassenname: 'Kommentar' . (von /Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7 aufgerufen)

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

99
shankardevy

In Rails 4 wurde :order veraltet und muss durch den Lambda-Scope-Block ersetzt werden, wie in der Warnung gezeigt, die Sie in der Frage gepostet haben. Zu beachten ist auch, dass dieser Gültigkeitsbereichblock vor anderen Zuordnungsoptionen wie dependent: :destroy usw. übergeben werden muss. 

Probieren Sie es aus:

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

Um die Reihenfolge der Reihenfolge anzugeben, d. H. Entweder asc oder desc als @ joshua-coady und @wsprujit vorgeschlagen, verwenden Sie: 

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

oder mit dem Hash-Stil: 

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

Weitere Hinweise zu Aktive Datensatzbereiche für has_many .

236
vee

Es dauerte eine Weile, bis ich herausgefunden hatte, wie man die Reihenfolge und das Einschließen von Objekten ausführte. Schließlich fand ich heraus, dass Sie den Geltungsbereich verketten -Anweisungen,

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

Ich habe nur gedacht, ich würde hinzufügen, dass, wenn Sie irgendwelche Optionshashargumente haben, sie nach dem Lambda gehen müssen, wie folgt:

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

Ich habe eine Minute gebraucht, um das selbst herauszufinden - hoffentlich hilft es allen anderen, die zu dieser Frage kommen und das gleiche Problem haben.

19
Wylliam Judd

Das funktioniert bei mir mit Rails 4 & MongoDB

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