2011-08-07 10 views
1

ユーザごとに1つのランダムレコードを選択する方法はありますが、最新のレコードprで配列を並べ替えるにはどうすればいいですか?ユーザー。Rails 2データベースロジックをRails 3.1/PostgreSQLに変換する際のヘルプ

Fooが新しい絵をアップロードした場合、fooから1つのランダムなレコードを選択したいと思います。この方法では、10枚の絵をアップロードするユーザーは、フロントページのすべてのスペースを独占することはありませんが、ページの上部にはまだスロットがあります。

これは、MySQL上で実行されているRails 2.xでこれを行った方法です。

@paintings = Painting.all.reverse 
first_paintings = [] 
@paintings.group_by(&:user_id).each do |user_id, paintings| 
    first_paintings << paintings[rand(paintings.size-1)] 
end 
@paintings = (first_paintings + (Painting.all - first_paintings).reverse).paginate(:per_page => 9, :page => params[:page]) 

上記の例では、多くのSQLクエリが生成され、正しく最適化されています。 PostgreSQL上で実行されているRails 3.1ではどうすればよいですか?あなたが本当に絵画の順序を逆にしたい場合は、私は7000枚の記録..

答えて

1

@paintings = Painting.all.reverse = @paintings = Painting.order("id desc")

を持っている結果、私はちょうど使用し、スコープを設定します設定することを

何か

のような
class Painting < ActiveRecord::Base 
    scope :reversed, order("id desc") 
end 

次に、あなたはどこでもあなたはそれが

+0

私はあなたが使用方法について '' 'Painting.reversed'''を意味したと思います。 –

+0

笑:)ありがとう、訂正しました! – jamesc

+0

問題はありません。喜んで助けてください。 –

0

あなたはuの可能性必要Painting.reversedを使用することができますダイナミックファインダをSE:

Painting.order("id desc").find_by_user_id!(user.id) 

これはあなたの絵画のテーブルを想定しているが、USER_ID列またはあなたがあなたの最初のコードでuser_idを呼び出しているので、あなたがカバーしている現れる絵にユーザーを関連付けるためにいくつかの他の方法が含まれています。これはランダムではありませんが、find_all_by_user_idを使用すると、無作為な絵を探して見つけたければ、.reverseを呼び出すことができます。

+0

申し訳ありませんが、私はランダムなレコードが必要です。ユーザー。そうでなければ、ページは静的に感じるでしょう。 – atmorell

+0

ダイナミックファインダーを使ってすべての絵を取り戻してから、rand()を呼び出します。 –

1

あなたは間違いなくあなたのPaintingモデルでbelongs_toの関連付けを設定しているので、私はどうなる:

# painting.rb 
default_scope order('id DESC') 

# paintings_controller.rb 
first_paintings = User.includes(:paintings).collect do |user| 
    user.paintings.sample 
end 
@paintings = (first_paintings + Painting.where('id NOT IN (?)', first_paintings)).paginate(:per_page => 9, :page => params[:page]) 

は、私が最も少ないのSQLクエリで、このソリューションの結果を考えると、非常に読みやすいです。テストされていないが、私はあなたがそのアイデアを持っていればいいと思う

+0

あなたの例では小さな問題があるようです:NoMethodError:#の 'paginate 'メソッドが未定義です。 – atmorell

関連する問題