2009-03-20 7 views
5

J'ai une application rails J'essaie de configurer des listes triables en utilisant le plugin acts_as_list. Le champ de position dans la base de données est mis à jour, mais lorsque la page est rendue, l'ordre n'est pas pris en compte. Je cherche de l'aide, je suppose.Utilisation de acts_as_list avec has_many: through in rails

Voici mes modèles ...

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 

Et le code de la vue bâclée qui me donne la liste ...

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

Le glisser-déposer fonctionne pour la remise en ordre. La valeur de position est mise à jour dans la base de données pour les objets QuestionMembership et la page affiche la réorganisation correctement. Le problème est que lors d'un rechargement de page, il revient par défaut à l'ordre dans lequel il se sent. Je pense que c'est par défaut à la question id pour l'ordre au lieu de la position d'accession à la question, mais je ne suis pas sûr.

Avez-vous des idées sur la façon dont je peux le faire réellement commander sur le rendu initial par le champ de position de QuestionMembership?

Répondre

8

La version finale:

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

dans ce cas, est l'attribut de position sur le modèle de question et le modèle de formulaire? – Paul

+1

Oui, l'attribut position est juste une colonne sur la table de jointure. –

3

Dès que je poste la question, je trouve la réponse. Il me manquait les attributs: order et: scope sur mes modèles.

+2

vous devriez publier le code corrigé et accepter votre propre réponse. –

+0

Vous devriez également mettre à jour votre autre réponse avec ceci, pas ajouter une nouvelle réponse. –

1

Avec Rails 2.3, vous pouvez définir une étendue par défaut de toujours ordre de position:

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

Notez que cet usage de la portée est différente de celle de acts_as_list, qui décide quoi la liste portée à.

2

J'avais un mal fou à travailler cela. Jusqu'à ce que je trouve cet exemple, j'utilisais simplement acts_as_list sur le modèle "Question". Ça marcherait, mais Rails commençait à devenir confus quand j'essayais de créer de nouvelles Questions.

Je l'ai essayé de cette façon, et j'ai pu créer de nouveaux objets, mais il semblait que mon application ne savait pas quel modèle le champ "position" devrait avoir. Enfin, je me suis rendu compte que, dans mon cas, il était tout à fait approprié d'utiliser uniquement le modèle de jointure comme champ de position, car c'est exactement ce que le mot-clé: scope était pour! Il couvre l'ordre des "Questions" à chaque "Formulaire", qui peut être différent par le formulaire. Après cela, je viens d'abandonner la liste acts_as_list du modèle "question", et j'ai traité le tri en saisissant les instances "QuestionMembership" (puis en utilisant leurs enfants pour afficher les données). Je sais que je ne rajoute pas beaucoup ici, mais les lumières sont venues pour moi, et peut-être que ce commentaire aidera quelqu'un d'autre.

Questions connexes