2009-03-20 20 views
5

私は、レールアプリを持っています。私は、acts_as_listプラグインを使用してソート可能なリストを設定しようとしています。 db内のpositionフィールドが更新されていますが、ページがレンダリングされると、その順序は考慮されません。私はいくつかの助けを探しています。ここでacts_as_list with has_many:through in rails

は私のモデル...

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 

、私にリストを与えるずさんなビューのコードです...

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

ドラッグ&ドロップは、並べ替えのために動作します。位置値はQuestionMembershipオブジェクトのDB内で更新され、実際にページには再注文が正しく表示されます。問題は、ページのリロード時に、デフォルトの状態に戻り、どのような順序になっているかということです。私はそれがquestion_membershipの代わりにorderのquestion idにデフォルト設定されていると思うが、わからない。

QuestionMembershipの位置フィールドで最初のレンダリングで実際に注文する方法についてのアイデアはありますか?

答えて

8

最終バージョン:

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

は、質問モデルとフォームモデルの位置属性ですか? – Paul

+1

はい、position属性はjoinテーブルの単なる列に過ぎません。 –

3

私が質問を投稿するとすぐに、答えが見つかります。私はモデルに::and:scope属性がありませんでした。 Railsの2.3

+2

あなたは訂正されたコードを投稿し、あなた自身の答えを受け入れるべきです。 –

+0

また、新しい回答を追加するのではなく、これで他の回答を更新する必要があります。この場合の –

1

あなたは位置によって、常に順番にデフォルトのスコープを設定することができます。リストにスコープに何を決定するスコープのこの用法はacts_as_listのものとは異なることを

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

注意を。

2

私はこれをワークアウトひどい時間を過ごしました。この例が見つかるまで、私は "質問"モデルでacts_as_listを使っていました。それはうまくいくだろうが、新しい質問を作成しようとするとRailsが混乱していた。

私はこの方法で試しましたが、私は新しいオブジェクトを作成することができましたが、私のアプリは「位置」フィールドがどのモデルで生きているのか混乱しているようでした。

最後に、私のケースでは、positionフィールドをオンにするための結合モデルだけを使用することが完全に妥当であることを認識しました。それぞれの "フォーム"に "質問"の順序を指定します。は、フォームごとに異なる場合があります。この後、私は "質問"モデルからacts_as_listを削除し、 "QuestionMembership"インスタンスを取得して(そして子供を使ってデータを表示する)ソートを処理しました。

私はここにはあまり追加していないが、ライトが私のために来たと知っている、そしておそらくこのコメントは他の誰かを助けるだろう。

関連する問題