2009-03-20 8 views
5

Ich habe eine App "rails", die ich mit sortierbaren Listen mithilfe des Plugins "acts_as_list" einrichten möchte. Das Positionsfeld in der Datenbank wird aktualisiert, aber wenn die Seite gerendert wird, wird die Reihenfolge nicht berücksichtigt. Ich suche nach Hilfe, denke ich.Verwenden von "acts_as_list" mit "has_many: through in rails"

Hier sind meine Modelle ...

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 

Und die schlampig Ansicht Code, der mir die Liste gibt ...

<% @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 %> 

Die Drag & Drop arbeitet für die Nachbestellung. Der Positionswert wird im DB für die QuestionMembership-Objekte aktualisiert, und die Seite zeigt die Neuordnung korrekt an. Das Problem ist, dass beim erneuten Laden der Seite die Standardeinstellungen wiederhergestellt werden. Ich denke, es ist standardmäßig die Frage ID für die Bestellung anstelle der Frage_Mitgliedschaft Position, aber ich bin mir nicht sicher.

Irgendwelche Ideen auf, wie ich es eigentlich bestellt auf dem Anfang durch das Positionsfeld des QuestionMembership machen machen?

Antwort

8

Die finale Version:

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

Ist in diesem Fall das Positionsattribut für das Fragenmodell und das Formularmodell? – Paul

+1

Ja, das Positionsattribut ist nur eine Spalte in der Join-Tabelle. –

3

Sobald ich die Frage posten, finde ich die Antwort. Mir fehlen die Attribute: order und: scope auf meinen Modellen.

+2

sollten Sie den korrigierten Code veröffentlichen und Ihre eigene Antwort akzeptieren. –

+0

Sie sollten auch Ihre andere Antwort mit diesem aktualisieren, keine neue Antwort hinzufügen. –

1

Mit Rails 2.3 können Sie einen Standardbereich festgelegt durch Position immer Reihenfolge:

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

Beachten Sie, dass diese Nutzung des Bereichs unterschiedlich ist als die von acts_as_list, das, was die Liste Umfang entscheidet.

2

ich aus einer schrecklichen Zeit arbeitet diese mit. Bis ich dieses Beispiel fand, hatte ich nur acts_as_list im "Frage" -Modell verwendet. Es würde funktionieren, aber Rails wurde verwirrt, als ich versuchte, neue Fragen zu erstellen.

Ich habe versucht, es auf diese Weise, und ich konnte neue Objekte erstellen, aber es schien, dass meine app war verwirrt darüber, welches Modell das Feld „Position“ leben sollten.

Schließlich erkannte ich, dass es in meinem Fall völlig angemessen war, nur das Join-Modell als das Positionsfeld zu verwenden, denn genau dafür war das Schlüsselwort: scope gedacht! Er legt die Reihenfolge von "Fragen" zu jedem "Formular" fest, , die pro Formular unterschiedlich sein können. Danach habe ich die acts_as_list aus dem "question" -Modell weggelassen und die Sortierung basierend auf den "QuestionMembership" -Instanzen behandelt (und dann ihre Kinder verwendet, um die Daten anzuzeigen).

Ich weiß, dass ich hinzufüge, hier nicht viel, aber die Lichter kam für mich an, und vielleicht wird dieser Kommentar jemand anderes helfen.

Verwandte Themen