列出项目可以在多个列表中的项目顺序(ruby on rails)

时间:2011-12-17 01:53:11

标签: ruby-on-rails ruby jquery-ui

所以我有一个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

2 个答案:

答案 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。