2011-12-17 41 views
2

所以我有一個Rails應用程序,它允許用戶創建列表並將項目放在列表中。作爲一項功能,用戶可以將任何一個項目放在多個列表中。例如:它的所有列出項目的順序,當項目可以在多個列表(紅寶石在軌道上)

LIST_1
  -item_1
  -item_2

List_2
  -item_3
  -item_2

的關係方面是完整的,做工精細。

下一步是讓用戶安排他們的列表中的項目。我安裝了act_as_list,並使用jQuery sortable得到了一個簡單的拖放工作排序項目。問題是每個項目都有一個位置。因此,如果我在list_1上將item_2的位置更改爲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

哪個模型是用戶在哪個模型之間拖動的? – 2011-12-17 02:54:12

+0

用戶正在查看一個列表,這是`@ list`的顯示視圖,其中`@items = @ list.items`。用戶可以上下拖動項目以在列表中對其進行排序。每拖動一次後,位置被保存。目前我所擁有的是能夠簡單地保存物品當前位置,當我真的需要能夠保存該物品相對於此列表的位置時,無需改變其在每個其他列表中的位置。 – JonathanSimmons 2011-12-17 03:05:19

回答

3

所以我用一點時間努力回答了我自己的問題。對於任何未來可能遇到此問題的人,我都提供了一個示例。

基本上@thedeeno的答案將工作得很好,如果我能夠使用範圍。在我的情況下,該列表將由用戶創建,因此範圍不是一個選項。

解決方案:
所以我的溶液(通過連接表我有很多)添加位置列到我的任務表

這樣,每個任務現在可以有一個LIST_ID和ITEM_ID和位置。

然後在我的控制器,我做了以下填充@items哈希

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

這給使@item已經爲各自的列表中的位置的項目位置排序。

現在最後一步是使用可排序更新它們的位置。要更新正確的項目位置,我需要排序以發送list_id以及id的每個順序。爲了獲得與郵寄給我增加了隱藏李和id的@list的,像這樣

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

這意味着我現在PARAMS看起來像這樣

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

最後使用的技能我的LIST_ID已從http://railscasts.com/episodes/147-sortable-lists瞭解到我將我的排序行爲更改爲以下內容

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 

就是這樣!用戶現在可以將任意數量的列表和項目創建爲多個列表並獨立地對每個列表進行排序。希望這可以幫助別人!

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 

作用域的要點是使位置相對於另一個模型。您也可以將多個職位定義爲多個模型。

編輯:

如果多個範圍是你的問題,你可能想簽出sortable寶石。