如何在Ajax列表中存储项目的顺序?

时间:2011-01-08 14:58:44

标签: ruby-on-rails ajax model

我有2个模型,用户和项目。现在,它们通过has_and_belongs_to_many连接(多对多)连接。用户有一个项目列表,此列表可由ajax排序。但我想存储这个订单。如何以正确的方式发送此订单并存储?

3 个答案:

答案 0 :(得分:1)

可排序列表我使用jQuery UI - > http://jqueryui.com/demos/sortable/

获取列表:

var projects = Array();
var j=0;

$("#sortable li").each(function(i, item){
   projects[j] = $("#"+item.id).html();            
   j++;
});

var data = {"list": projects};

然后我用ajax发送数据

答案 1 :(得分:1)

您必须将用户列表上项目的顺序视为用户与项目之间关系的属性。每对用户/项目都有一个属性'order',对吗?

因此,信息应该放在中间表(projects_users)中。

但是,由于您无法将属性添加到have_and_belongs_to_many链接表,因此应将其更改为:

class User
  has_many :allocations
  has_many :projects, :through => :allocations
end

class Project
  has_many :allocations
  has_many :users, :through => :allocations
end

并且分配表的迁移应该是这样的:

create_table :allocations do |t|
  t.integer :project_id
  t.integer :user_id
  t.integer :order
end

这样,对于分配给定用户的每个项目,您可以指定订单。

我希望这会有所帮助。

答案 2 :(得分:1)

你可以做的是使用Javascript循环遍历所有项目,并使用AJAX将一个ID数组发送到Rails动作(如Manu Mora给出的示例)。参数看起来像这样:

project_ids: 1,3,5,2,4
id: 1

然后在您的Controller操作中,您可以执行以下操作:

@user = User.find(params[:id])
@user.update_attributes(:project_ids => params[:project_ids].split(","))

我不知道如何自动发送参数,因此我使用split。我不知道使用HABTM时订单是否合适。如果没有,则应将has_many :through与“订单”或“排名”列结合使用。我向你展示的方式不适用,因为你还需要设置订单栏。

希望它有效。 :)