我的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排序总是保存在集合中,我可以以某种方式禁用它吗?
答案 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
这样的插件来提供此功能和其他有用的功能。