1

「PostView」というモデルを作成しました。ユーザーが投稿を表示するたびに、データベースにログインします(ユーザーIDと投稿IDを使用して新しいレコードを作成します)。

DBにユーザーごとに10レコードだけを保持したい。したがって、新しいレコードが追加されるたびに、最新の10レコードを除くすべてを削除したいと思います。

  1. これは効率的ですか?そうでない場合、ユーザー/投稿ビューをログに記録する方法として何を提案しますか?
  2. Railsで新しいレコードを追加して最新の10レコードを除くすべてを削除するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

3

これは多くのオーバーヘッドを引き起こすようであり、定期的にcronを介してデータベースを整理する方がよいようです。または、本当に最後の10レコードのみが必要な場合は、それらを保存するためのより効率的な方法を見つけてください。しかし、それができない場合は...

cutoff = PostView.where(:user_id => user_id, :post_id => post_id).
                  order('created_at DESC').
                  offset(10).first

PostView.where(:user_id => user_id, :post_id => post_id).
         where(['created_at <= ?', cutoff.created_at]).
         delete_all
于 2012-11-17T00:49:53.180 に答える
0

このコマンドは、user_idとpost_idに一致するすべてのレコードを照会し、それらのレコードを最新のものから順に並べ替え、そのセット内で10番目に最新のレコードを超えているレコードを破棄します。

PostView.where(user_id: user_id, post_id: post_id).
         order('id desc').offset(10).destroy_all

この問題のもう1つの解決策は、毎回新しいPostViewレコードを作成する代わりに、10番目に古いレコードが存在する場合はそれを更新し、そうでない場合は新しいレコードを作成することです。

pv = PostView.first(where: ["user_id = ? AND post_id = ?", user_id, post_id], 
                    order: "id desc", offset: 9) || PostView.new
pv.update_attributes(field1: value1, field2: value2, 
                     created_at: Time.now)
于 2014-07-10T21:08:06.933 に答える