2009-03-20 15 views
5

Mam aplikację rails Próbuję skonfigurować sortable list przy użyciu wtyczki acts_as_list. Pole pozycji w db jest aktualizowane, ale kiedy strona jest renderowana, zamówienie nie jest brane pod uwagę. Szukam chyba jakiejś pomocy.Używanie acts_as_list z has_many: through in rails

Oto moje modele ...

class QuestionMembership < ActiveRecord::Base 
    belongs_to :form 
    belongs_to :question 
    acts_as_list 
end 

class Form < ActiveRecord::Base 
    has_many :question_memberships 
    has_many :questions, :through => :question_memberships 
end 

class Question < ActiveRecord::Base 
    has_many :question_memberships 
    has_many :forms, :through => :question_memberships 
    acts_as_list 
end 

A niechlujny kod pogląd, że daje mi listę ...

<% @form.question_memberships.each do |qm| %> 
    <% q_id = "question_#{qm.id}" %> 
    <li class="question" id=<%= q_id %> > 
    <div style="color: #999; font-size: 8pt"> 
     <%=h qm.question.content %> 
    </div> 
    </li> 
    <%= draggable_element(q_id, :revert=>true) %> 
<% end %> 

przeciągnij i upuść działa do zmiany kolejności. Wartość pozycji aktualizuje się w DB dla obiektów QuestionMembership, a strona faktycznie pokazuje prawidłową zmianę kolejności. Problem polega na tym, że po przeładowaniu strony domyślnie powraca do dowolnej kolejności. Myślę, że domyślnie jest to identyfikator zapytania dla zamówienia zamiast pozycji pozycja_pytania, ale nie jestem pewien.

Jakieś pomysły dotyczące tego, w jaki sposób mogę sprawić, by faktycznie zamawiał się na początkowym renderingu w polu pozycji w QuestionMembership?

Odpowiedz

8

Ostateczna wersja:

class QuestionMembership < ActiveRecord::Base 
    belongs_to :form 
    belongs_to :question 
    acts_as_list :scope => :form 
end 

class Form < ActiveRecord::Base 
    has_many :question_memberships, :order => "position" 
    has_many :questions, :through => :question_memberships 
end 

class Question < ActiveRecord::Base 
    has_many :question_memberships, :order => "position" 
    has_many :forms, :through => :question_memberships 
    acts_as_list :scope => :form 
end 
+0

w tym przypadku jest atrybut pozycji w modelu pytań i modelu formularza? – Paul

+1

Tak, atrybut pozycji jest po prostu kolumną w tabeli łączenia. –

3

Gdy tylko opublikuję pytanie, znajduję odpowiedź. Brakowało mi atrybutów: order i: scope w moich modelach.

+2

powinieneś opublikować poprawiony kod i zaakceptować własną odpowiedź. –

+0

Powinieneś również zaktualizować swoją drugą odpowiedź, nie dodając nowej odpowiedzi. –

1

Z Rails 2.3 można ustawić domyślny zakres, aby zawsze kolejności przez stanowisko:

acts_as_list :scope => <scope clause> 
default_scope :order => :position 

Zauważ, że to wykorzystanie zakres jest inny niż acts_as_list, który decyduje, co do zakresu listy do.

2

miałem straszny czas pracy to. Dopóki nie znalazłem tego przykładu, używałem act_as_list w modelu "Pytanie". To by działało, ale Rails był zmieszany, gdy próbowałem tworzyć nowe pytania.

Próbowałem to w ten sposób, i mogę tworzyć nowe obiekty, ale wydawało się, że moja aplikacja była mylić o który model „pozycja” pole powinno żyć.

Wreszcie, zdałem sobie sprawę, że w moim przypadku całkowicie właściwe było użycie tylko modelu łączenia, jako że pole position jest włączone, ponieważ właśnie to było: słowo kluczowe scope: for! Obejmuje uporządkowanie "pytań" do każdej "formy", , która może być różna dla każdego formularza. Po tym, porzuciłem act_as_list z modelu "pytanie" i zająłem się sortowaniem w oparciu o instancje "QuestionMembership" (a następnie używając ich dzieci do wyświetlenia danych).

wiem, że nie dodaję dużo tutaj, ale światła opuszcza mnie, a może ten komentarz pomoże kogoś innego.

Powiązane problemy