2013-08-17 15 views
86
class RelatedList < ActiveRecord::Base 
    extend Enumerize 

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

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

end 

Mam ten model w mojej aplikacji rails, który rzuca ostrzeżenie, gdy próbuję tworzyć rekordy w konsoli.Nieaktualne ostrzeżenie dla Rails 4 has_many z zamówieniem

Wycofanie UWAGA: W RelatedList.has_many następujących opcji: deklaracja treści są nieaktualne:: zamówienia. Zamiast tego użyj bloku zakresu. Na przykład: has_many : spam_comments, conditions: {spam: true}, class_name: 'Komentarz' powinien zostać przepisany w następujący sposób: has_many: spam_comments, -> { gdzie spam: true}, class_name: 'Comment " . (Nazywany z co /Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7)

Wydaje się Szyny 4 posiada nowy: zamów składnia do stosowania w modelach ale nie mogę wydaje się znaleźć dokumentację w Poradniku Railsowym.

Odpowiedz

214

W Railsach 4, :order został wycofany i należy go zastąpić blokiem lambda, zgodnie z ostrzeżeniem zamieszczonym w pytaniu. Inną kwestią jest, aby pamiętać, że blok ten zakres musi być przekazane przed innymi opcjami, takimi jak stowarzyszenia dependent: :destroy itp

spróbuj tego:

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

aby określić kierunek zamówienia, tj albo asc lub desc jako @ Joshua-Coady i @wsprujit sugerują, zastosowanie:

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

lub, używając stylu hash:

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

Dalsze informacje na temat Active Record Scopes for has_many.

+3

działa znakomicie! gdzie mogę znaleźć takie informacje w przewodnikach lub dokumentach? Nie mogę go znaleźć. dzięki. – shankardevy

+1

[Informacje na temat zakresu zamówienia w przewodnikach] (http://guides.rubyonrails.org/association_basics.html#scopes-for-has-many-order) –

+4

Co zrobić, jeśli masz więcej niż jedną wycofaną opcję, powiedzmy "oder" 'i' include'?To: '{order (: position), include (: track)}' wyrzuca błąd na przecinku. – kakubei

26

Zajęło mi trochę czasu, aby dowiedzieć się, jak zrobić porządek i to, że w końcu stwierdziliśmy, że chain the scope oświadczenia,

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

To był dokładnie mój problem. Próbuję dowiedzieć się, jak zamówić związek ma_many przez atrybut nadrzędny. Nie zdawałem sobie sprawy, że możesz robić takie rzeczy, a następnie zamówić. Dzięki! – timothyashaw

-4

Alternatywnie, można umieścić klauzulę order od modelu, na przykład:

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

staje

has_many :options # In class Answer 

default_scope { order 'name' } # In class Option 

P S: Dostałem ArgumentError: wrong number of arguments (1 for 0) podczas robienia has_many :things, -> {}.

+4

Nie używaj domyślnego zakresu. Jeśli jesteś do tego przyzwyczajony, możesz dodać tę magiczną metodę bardziej logicznie. Trudno to zmienić w przyszłości. –

13

Pomyślałem, że mogę dodać, że jeśli masz żadnych argumentów opcja mieszania, muszą przejść po lambda, tak:

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

Zajęło mi chwilę, aby dowiedzieć się tego sama - mam nadzieję, że to pomaga każdy, kto przychodzi na to pytanie, ma ten sam problem.

+0

Dotyczy to również "przez" asocjacji, które mogą istnieć na obiekcie - 'has_many: items, -> {order 'name'}, through:: suppliers' –

Powiązane problemy