从数组中按ID排序集合

时间:2012-01-07 01:23:09

标签: ruby-on-rails ruby

我的Thread模型有很多Posts。假设我想通过一个包含id的数组重新排序帖子,我希望看到我的帖子排序。

thread.posts.collect {|x| x.id} # => [1,2,3]
order = [2,3,1]

posts = thread.posts.sort_by {|x| order.index x.id}
posts.collect {|x| x.id} # => [2,3,1]

thread.update_attributes(:posts => posts) # => true
thread.posts.collect {|x| x.id} # => [1,2,3]

我做错了什么?按ID排序总是保存在集合中,我可以以某种方式禁用它吗?

1 个答案:

答案 0 :(得分:2)

除非您特别要求对它们进行排序,否则您应该始终假设从数据库中检索到的结果的顺序或多或少是“随机”的。这意味着您可以依赖您的数据库来神奇地存储与线程关联的帖子的顺序(实际上,您发布的代码示例可能根本不会查询数据库,因为没有任何内容更新)。

实现目标的最简单方法是在order模型中添加Post字段,如下所示:

class AddOrderToPost < ActiveRecord::Migration
  def up
    change_table :posts do |t|
      t.integer :order, :default => 0
    end
    Post.update_all ["order = ?", 0]
  end

  def down
    remove_column :posts, :order
  end
end

Thread模型中:

class Thread < ActiveRecord::Base
  # ...
  has_many :posts, :order => 'order ASC'
  # ...
end

之后您可以对这些帖子进行重新排序:

thread.posts.zip([2,3,1]) { |p,i| p.order = i }

如果需要,您还可以使用acts_as_list这样的插件来提供此功能和其他有用的功能。