Ruby on rails 当项目可以位于多个列表上时,按顺序列出项目(ruby on rails)

Ruby on rails 当项目可以位于多个列表上时,按顺序列出项目(ruby on rails),ruby-on-rails,ruby,jquery-ui,Ruby On Rails,Ruby,Jquery Ui,所以我有一个rails应用程序,它允许用户创建列表并将项目放在该列表上。作为一项功能,用户可以将任何一项放在多个列表中。例如: 列表1 -项目1 -项目2 列表2 -第3项 -项目2 这一切的关系面是完整的,运作良好 下一步是让用户在列表中排列项目。我安装了act_as_list,并使用jQuery sortable对项目进行了简单的拖放排序。问题是每个项目都有一个位置。因此,如果我将列表中项目2的位置更改为1,那么项目2的位置现在在每个列表中都是1 我在想一种方法来存储相对于列表的项目位置。有

所以我有一个rails应用程序,它允许用户创建列表并将项目放在该列表上。作为一项功能,用户可以将任何一项放在多个列表中。例如:

列表1
-项目1
-项目2

列表2
-第3项
-项目2

这一切的关系面是完整的,运作良好

下一步是让用户在列表中排列项目。我安装了act_as_list,并使用jQuery sortable对项目进行了简单的拖放排序。问题是每个项目都有一个位置。因此,如果我将列表中项目2的位置更改为1,那么项目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项
分配模型

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

  validates_uniqueness_of :item_id, :scope => :list_id
end
类分配:list\u id的唯一性
结束

您可以将这些“列表”提升为正式模型,然后范围作为该模型的列表位置。与文档中的示例类似:

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

class Item < ActiveRecord::Base
  belongs_to :list
  acts_as_list :scope => :list
end
类列表“位置”
结束
类项:列表
结束
范围界定的要点是使位置相对于另一个模型。您还可以将多个位置限定为多个模型

编辑:


如果多个作用域是您的问题,那么您可能希望签出gem。

因此,一位专家花了一点时间和精力回答了我自己的问题。下面我为将来可能遇到这个问题的人提供了一个例子

基本上,如果我能够使用示波器,@thedeeno的答案会很好地工作。在我的例子中,列表将由用户创建,因此范围不是一个选项

解决方案:
因此,我的解决方案是在我的工作分配表中添加一个职位列(我的工作分配表的联接表有很多个到)

这样,每个作业现在都可以有一个列表id和项目id以及一个位置

然后在我的控制器中,我执行以下操作来填充@items散列

@items = @list.items.order(:position)
这使得@item已按项目位置为其各自的列表位置排序

现在,最后一步是使用sortable更新它们的位置。为了更新正确项目的位置,我需要sortable将列表id与id的每个订单一起发送。为了获得随帖子一起发送的列表id,我添加了一个隐藏的li和@list的id,如下所示

<li id='list_<%=@list.id %> style='display:none'></li>
最后,利用从中学习到的技能,我将排序操作更改为以下内容

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

就这样!用户现在可以创建任意数量的列表和项目到多个列表,并对每个列表进行独立排序。希望这对别人有帮助

添加此项确实会使每个列表按项目位置对其项目进行排序。谢谢你。我以前是在控制器中手动操作的。但是,它并不能解决项目在每个列表上的位置不同的问题。它不应该有不同的相对位置吗?查看我添加到回答中的gem用户拖动的是哪个模型?用户正在查看一个列表,它是
@list
的显示视图,其中
@items=@list.items
。用户可以上下拖动项目以在列表中对其进行排序。每次拖动后,将保存位置。目前,我所拥有的是简单地将项目保存到当前位置的能力,当我真的需要能够保存该项目相对于它所在的列表的位置时,无需更改它在其他列表中的位置。
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