在find()生成的列表中使用Rails中的sortable_element

时间:2010-05-03 11:43:29

标签: ruby-on-rails ruby activerecord scriptaculous jquery-ui-sortable

我正在尝试使用scriptaculous辅助方法sortable_element在我的Rails应用程序中实现拖放可排序列表。虽然视图的代码看起来很简单,但我真的不太清楚在控制器中写什么来更新“位置”列。

以下是我的观点,“_ show_related_pgs.erb”:

<ul id = "interest_<%=@related_interest.id.to_s%>_siblings_list">
    <%= render :partial => "/interests/peer_group_map", :collection => @maps, :as => :related_pg %>
</ul>

<%= sortable_element("interest_"+@related_interest.id.to_s+"_siblings_list", :url => {:action => :resort_related_pgs}, :handle => "drag" ) %>
<br/>

这是部分相关的行,“interest / peer_group_map.erb”

  <li class = "interest_<%=@related_interest.id.to_s%>_siblings_list"
         id = "interest_<%=related_pg.interest_id.to_s%>_siblings_list_<%=related_pg.id.to_s%>">

Scriptaculous UI魔法适用于这些,但我不确定如何更改数据库中的“位置”列以反映这一点。我是否应该将集合@maps传递回控制器并告诉它迭代它并增加/减少每个属性“position”?如果是这样,我如何判断哪个项目已向上移动,哪个项目向下移动?在生成的html中,我无法使用Chrome开发工具找到任何具体内容。

每个重排后,我还需要重新呈现收集@maps因为位置被打印出来,旁边的每个感兴趣的名称(我使用它作为我的电话给sortable_element(以下简称“处理”规定)) - 虽然这应该是微不足道的。

有什么想法?

谢谢, -e

1 个答案:

答案 0 :(得分:0)

我通常在我的控制器中创建一个如下所示的排序操作:

def sort
  order = params[:my_ordered_set]
  MyModel.order(order)
  render :nothing => true
end

不要忘记添加路线:

map.resources :my_model, :collection => { :sort => :put }

现在,在MyModel上我添加了一个类方法,用一个查询更新所有已排序的记录(这只适用于mysql,我认为......):

def self.order(ids)
  update_all(
    ['ordinal = FIND_IN_SET(id, ?)', ids.join(',')],
    { :id => ids }
  )
end

单一查询方法来自Henrik Nyh