2011-12-17 4 views
2

これは、リストを作成してそのリストにアイテムを置くためのレール・アプリです。機能として、ユーザーは複数のリストに1つのアイテムを置くことができます。例:アイテムが複数のリスト(ルビー・オン・レール)にあるときのアイテムの並びをリストアップ

List_1
  -item_1
  -item_2

List_2
  -item_3
  -item_2

それをすべての関係側が完了し、正常に動作しています。

次のステップは、ユーザーがリスト内のアイテムを手配することでした。私はact_as_listをインストールし、jQuery sortableを使用することで項目を並べ替えるための簡単なドラッグアンドドロップができました。問題は、それぞれのアイテムが1つのポジションを持っていることです。したがって、item_1の位置をlist_1で1に変更すると、item_2の位置はすべてのリストで1になります。

私は、リストとの相対的なアイテムの位置を格納する方法を考えようとしています。誰でも考えがありますか?

編集あなたが正式なモデルにこれらの 'リスト' を促進することができるコード

一覧モデル

class List < ActiveRecord::Base 
    belongs_to :user 

    has_many :assignments, dependent: :destroy 
    has_many :items, through: :assignments, order: 'position' 

end 

項目モデル

class Item < ActiveRecord::Base 
    belongs_to :user 

    has_many :assignments, dependent: :destroy 
    has_many :lists, through: :assignments 
    acts_as_list scope: :list 
end 

割り当てモデル

class Assignment < ActiveRecord::Base 
    belongs_to :item 
    belongs_to :list 

    validates_uniqueness_of :item_id, :scope => :list_id 
end 
+0

このモデルは、ユーザーがドラッグしているモデルですか? –

+0

ユーザは、 '@items = @list.items'がある' @list'のためのショービューであるリストを見ています。ユーザーは、アイテムを上下にドラッグしてリスト内で並べ替えることができます。各ドラッグの後、位置が保存されます。現在私が持っているのは、他のすべてのリストの位置を変えずに、このリストの相対的な位置を保存する必要があるときに、アイテムの現在の位置を簡単に保存できることです。 – JonathanSimmons

答えて

3

私は少し時間をかけて自分の質問に答えました。私は、今後この問題に遭遇する可能性のある人のために、以下の例を提供しました。

私がスコープを使用することができた場合、基本的に@ thedeenoの答えはうまくいきました。私の場合、リストはユーザー作成されるので、スコープはオプションではありません。

ソリューション:
(私は多くているために結合テーブル)この方法

各割り当てが今LIST_IDとのitem_idと位置を持つことができますので、私の解決策は、私の割り当てテーブルに位置列を追加しました。

はその後、私のコントローラで、私は@itemsを移入するには、以下のなかった

@items = @list.items.order(:position) 

をハッシュこれは、@itemは、それぞれのリスト位置のための項目位置によって命じたになりました。

最後のステップでは、ソート可能な位置を更新していました。正しい項目の位置を更新するために、私はlist_idをidの各注文と共に送るためにソート可能である必要がありました。私が最後にスキルIを使用して、私のparamsは、今、この

{"list"=>["31"], "item"=>["30", "58", "59", "24", "80", "81"]} 

のように見えたことを意味しそう

<li id='list_<%[email protected] %> style='display:none'></li> 

ように@listの隠されたとLiとIDを追加するポストで送らLIST_IDを取得するには私はそれだ、次の

def sort 
    @items = params[:item] 

    @items.each_with_index do |id, index| 
    assignment = Assignment.where(list_id: params[:list], item_id: id).update_all(['position=?', index+1]) 
    end 

render :nothing => true 
end 

に私の並べ替えアクションを変更http://railscasts.com/episodes/147-sortable-listsから学んでいました!ユーザは任意の数のリストおよびアイテムを複数のリストに作成し、各リストを独立してソートすることができるようになりました。これが誰かを助けることを願って!

0

を追加しますその後、scoそのモデルにpe acts_as_listの位置。ドキュメントの例と似ています:

class List < ActiveRecord::Base 
    has_many :items, :order => "position" 
end 

class Item < ActiveRecord::Base 
    belongs_to :list 
    acts_as_list :scope => :list 
end 

スコープのポイントは、別のモデルに相対的な位置を作ることです。また、複数のスコープで複数のモデルを配置することもできます。

EDIT:

複数のスコープがあなたの問題であるならば、あなたはsortable宝石をチェックアウトする場合があります。

+0

これを追加すると、各リストは項目の位置によって項目を並べ替えるようになりました。ありがとう。以前はコントローラーで手動でやっていました。しかし、それはそれがある各リストのための異なる位置を持つアイテムの問題を解決しません。 – JonathanSimmons

+0

は、相対位置が違っていてはなりませんか? –

+0

私は答えに加えた宝石をチェックしてください –

関連する問題