在Rails控制器方法中对项目进行排序

时间:2010-08-29 16:50:26

标签: ruby-on-rails ruby arrays sorting acts-as-list

我在编写控制器操作时遇到问题,该操作将Post ID作为参数传递,并在发布之前将它们排序为特定顺序。

帖子有一个position属性(我正在使用acts_as_list进行排序),并且已发布或未发布(可以使用named_scopes Post.publishedPost.unpublished进行搜索)。< / p>

基本上,有一个JavaScript接口允许用户将未发布的帖子拖到队列中,并通过将id作为post_ids参数传递给看起来像这样的控制器方法来发布它们:

def publish
  Post.update_all(['published=?', true], :id => params[:post_ids])
  redirect_to admin_path
end

发布像这样的帖子很好。我接下来需要做的是按照特定顺序对帖子进行排序,这就是我遇到问题的地方。

假设用户拖动帖子5,然后发布3,然后将7发布到队列中并点击“发布”。

我想要做的是然后按顺序组织所有帖子在第一个位置有5个,3个,然后按照它们已经在的顺序排列其余的Post对象,所以按Post.position排序是[5, 3, 7, ...the rest of the posts in order here...]

然后,如果用户要将两个新帖子拖入队列并单击“发布”(这次是说帖子2和4),帖子应该按照[2, 4, 5, 3, 7, ...the rest of the posts in order here...]

的顺序排列

然后最后一个例子,假设用户将帖子10,1和12移到队列上并发布,订单应为[10, 1, 12, 2, 4, 5, 3, 7, ...the rest of the posts in order here...]等......

我会显示我一直在处理的代码,但我不确定它是否有用,因为我没有让它正确排序。但基本上我认为这是一个采用两个数组的问题,第一个是所有帖子,第二个是要发布的帖子,并将每个项目放在帖子中以在所有帖子数组的开头发布数组,然后发布。我似乎无法让它工作。非常感谢任何帮助,我提前感谢您的时间!

修改的 万一它有帮助,这是我到目前为止编写的代码。在测试中,似乎此方法第一次正确地对队列中的帖子进行排序,但是发布的任何后续帖子都不会移动到已发布的帖子列表的前面。

def publish
  if params[:to_publish].present?
    # :to_publish are the posts dragged into the queue in order.
    # Here I'm cleaning up the Javascript input and then iterating 
    # through them to update their sort order.
    params[:to_publish].to_s.split(",").uniq!.each_with_index do |id, index|
      Post.update_all(['position=?', index + 1], ['id=?', id])
    end
  end
  # :post_ids are the posts to be published, order is irrelevant.
  # For client-side reasons they're passed as a separate parameter.
  Post.update_all(['published=?', true], :id => params[:post_ids])
  redirect_to admin_path
end

1 个答案:

答案 0 :(得分:0)

PARAMS [:to_publish]!.to_s.split( “”)的uniq

在这里,你为什么要做独特的检查?这是一种防御措施吗?

还要注意uniq!如果没有找到重复项,则返回nil,如果数组没有重复项,则会导致代码抛出nil引用错误。

如果你的代码中有一个救援块吞下这个零参考错误,你就麻烦了!