所以我有一个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 :(得分:3)
所以用一点时间努力回答了我自己的问题。我在下面为可能遇到此问题的任何人提供了一个示例。
如果我能够使用范围,基本上@thedeeno的答案会很好。在我的情况下,列表将是用户创建的,因此范围不是一个选项。
<强>解决方案:强>
所以我的解决方案是在我的赋值表中添加一个位置列(我的连接表有很多通过)
这样,每个作业现在都可以有一个list_id和item_id以及一个位置。
然后在我的控制器中,我执行了以下操作来填充@items哈希
@items = @list.items.order(:position)
这使得@item按项目位置按其各自的列表位置排序。
现在最后一步是使用sortable更新他们的位置。要更新正确的项目位置,我需要排序以发送list_id以及id的每个顺序。为了获得与帖子一起发送的list_id,我添加了隐藏的li和@list的id,如此
<li id='list_<%=@list.id %> style='display:none'></li>
这意味着我的参数现在看起来像这样
{"list"=>["31"], "item"=>["30", "58", "59", "24", "80", "81"]}
最后使用我从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
就是这样!用户现在可以创建任意数量的列表和项目到多个列表,并独立地对每个列表进行排序。希望这有助于某人!
答案 1 :(得分:0)
您可以将这些“列表”提升为正式模型,然后将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 gem。