2011-12-17 38 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宝石。