如何在排名模型gem中保存行顺序位置

时间:2014-10-25 09:23:44

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

我正在使用ranked model gem并继续使用 sortable tables tutorial

我有任务模型。

task.rb

include RankedModel
ranks :row_order

路由

 resources :tasks do
 post :update_row_order, on: :collection

tasks_controller.rb

  def update_row_order
   @task = Task.find(params[:task][:task_id])
   @task.row_order_position = params[:task][:row_order_position]
   @task.save
   render nothing: true 
  end

的Ajax

$.ajax(
      type: 'POST'
      url: '/tasks/update_row_order'
      dataType: 'json'
      data: { task: {task_id: item_id, row_order_position: position } }

拖动任务后

微量

Parameters: {"task"=>{"task_id"=>"141", "row_order_position"=>"0"}}

在表格中我有列row_order,保存一些随机值,如row_order = -8343750。 是否可以在db中保存row_order_position。比如1,2,3。

2 个答案:

答案 0 :(得分:0)

我相信排名模型的运作方式。如果你想要1,2,3之类的数字,你应该使用acts_as_lists。排名模型虽然效率更高。

这就是它的工作原理

  

排名模型仅对项目执行更新操作   题。它通过创建中途的排名来实现这一目标   在两个邻居之间,这些数字分布在一个非常   大范围; -8388607到8388607(签名的MEDIUMINT的范围   的MySQL。

     

如果在列表上进行了几千次重新排序后会发生什么情况   实际上是与排名数重叠,还是最终超出范围?   那么,在这种罕见的情况下,整个表格都会更新。

答案 1 :(得分:0)

(以下内容不是上述问题的准确答案,但假设您希望保存任务以便以后检索它。它还可以用于相对于另一个任务定位任务。)

不建议使用RankedModel在DB中保存row_order_position。排名模型方法的主要优点是您不需要保存在您编辑的那个之后的所有row_order_position。

如果要将其保存到数据库以便能够轻松确定特定任务的row_order_position,您可以执行以下操作:

class Plan < ActiveRecord::Base

include RankedModel
ranks :row_order

def calculated_row_order_position
  self.siblings.where('row_order < ?', self.row_order).count + 1
end

这是基于找到here的帖子,该帖子基于this post。我添加了“+ 1”以获得行位置,将任务计数开始为1.上面的解决方案假定您使用祖先来组织树结构中的任务,祖先使用.sibling来获取所有兄弟姐妹。

通过添加calculate_row_order_position方法,不需要保存row_order_position以便能够轻松获取任务的位置。

如果我没弄错的话你现在可以决定你的数据库更容易: 1.保存在保存时更改的任务之后所有任务的更改位置(act-as-list是您的最佳选择)。 要么 2.当您需要确定特定任务的row_order_position时,查询兄弟任务的row_order(选择排名模型宝石)。

如果我遗漏了任何内容,或者如果上述行为列表和排名模型之间的比较不正确,请告诉我。