2012-01-07 9 views
1

My 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で並べ替えることは常にコレクションに保存されていますが、どうにかそれを無効にすることはできますか?

答えて

2

データベースから検索された結果の順序は、具体的に並べ替えるように要求しない限り、「ランダム」であると常に仮定してください。これは、であることを意味します。データベースに依存して、スレッドに関連付けられた投稿の順番を魔法のように保存することができます(実際には、更新するものがないため、

あなたが望むものを達成するための最も簡単な方法は、このようなあなたのPostモデルにorderフィールドを追加することです:あなたThreadモデルで

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 

その後
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のようなプラグインを使うこともできます。

関連する問題